Garbage Collection, Untraceable Errors...
cy via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jun 13 09:24:51 PDT 2016
On Monday, 13 June 2016 at 08:49:55 UTC, Guillaume Piolat wrote:
> This thing helps with getting rid of such bugs.
I suppose. The real cause of the bugs is not destructors I think,
but memory corruption. Since frees (and double-frees) are
deferred so long, it's just impossible to even guess at where the
double destruction happened, or when you dereferenced a null
pointer and D didn't catch that... again.
For those bugs, it would really help to know which objects are
being freed, so you can check whether you accidentally forgot to
initialize them or whatnot. Debugging their destructors is not
the issue, and if it were I could just add a break inside the
destructor itself.
> Having a non-trivial destructor called by the GC, and relying
> on it, is imho an error at best, should always be manual.
I'd tend to agree. The reason I was using destructors at all is
because I was using an SQL database. Those things like to act
like whole global environments, where it's cheaper for you to
create two tables within the same database than to have two
databases open simultaneously, so usually when working with SQL I
will make the database a global object, initialized on demand.
Since there is *always* a database object, you can write code
that can be optimized at compile-time, instead of code that runs
conditionally at runtime, on the worthless check of whether it
gets passed a database object or not.
So, the only problem is if the database is guaranteed to be open
and usable anywhere in your code, when do you close it?
What I do is explicitly close it, then add a close() in the
destructor with a warning. And then I run into GC errors...
despite the only destructor in my entire program finishing
without error.
More information about the Digitalmars-d
mailing list