Understanding the GC
Jeremy DeHaan
dehaan.jeremiah at gmail.com
Thu Jan 31 19:57:16 PST 2013
On Thursday, 31 January 2013 at 23:53:26 UTC, Steven
Schveighoffer wrote:
> On Thu, 31 Jan 2013 18:27:59 -0500, Jeremy DeHaan
> <dehaan.jeremiah at gmail.com> wrote:
>
>> On Wednesday, 30 January 2013 at 10:29:26 UTC, monarch_dodra
>> wrote:
>>> To add to that, you also have to keep in mind that when the
>>> program terminates (even legally), instead of running a
>>> *full* collect cycle, the program just leaves, and lets the
>>> OS clear any allocated memory. This is both faster, and safer.
>>>
>>> What this means is that while there is a guarantee that
>>> "collection=>destruction", there is no guarantee that actual
>>> collection will happen.
>>>
>>> If you absolutely must be sure that something allocated gets
>>> *destroyed*, either destroy it yourself via an explicit call,
>>> or bind it to a stack based RAII scheme, possibly with
>>> reference counting.
>>>
>>
>> So there is no guarantee at all that a destructor will be
>> called even at the end of the program? Because there is an
>> example in the book using a class destructor to free allocated
>> data.
>
> I'm pretty sure all GCs do not have a guarantee of running all
> destructors. I think D's GC makes a good effort to do so.
>
>> I definitely understand now about how not to rely on a
>> destructor to free up memory during runtime, but it seems
>> counterintuitive to have the ability to write a destructor
>> with no guarantee it would ever be called even at cleanup.
>
> A destructor should ONLY be used to free up resources other
> than GC allocated memory. Because of that, it's generally not
> used.
>
> It should be used almost as a "last resort".
>
> For example, a class that holds a file descriptor should have
> both a destructor (which closes the descriptor) and a manual
> close method. The former is to clean up the file descriptor in
> case nobody thought to close it manually before all references
> were gone, and the latter is because file descriptors are not
> really managed by the GC, and so should be cleaned up when they
> are no longer used.
>
> This kind of gives us a paradox, since the class is managed via
> the GC, how do you know it's no longer used (that is, how do
> you know this is the last reference to it)? That is really up
> to the application design. But I wouldn't recommend relying on
> the GC to clean up your descriptors.
>
> -Steve
This makes a whole lot of sense to me. I never realized that a GC
could be imperfect in this regard. I also don't know much about
GC design and implementation, but that was the purpose of this
thread!
I definitely like the idea of having a manual way of cleaning up
and a destructor as a back up for times such as these.
Thanks for all the help guys! I learned a lot!
More information about the Digitalmars-d-learn
mailing list