Destructor semantics
Steven Schveighoffer
schveiguy at yahoo.com
Fri Aug 13 05:59:02 PDT 2010
On Thu, 12 Aug 2010 16:08:17 -0400, Don <nospam at nospam.com> wrote:
> Steven Schveighoffer wrote:
>> On Thu, 12 Aug 2010 13:05:53 -0400, Joe Greer <jgreer at doubletake.com>
>> wrote:
>>
>>> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote in
>>> news:op.vhbtwjhoeav7ka at localhost.localdomain:
>>>
>>>>> Logically speaking if an object isn't destructed, then it lives
>>>>> forever and if it continues to hold it's resource, then we have a
>>>>> programming error. The GC is for reclaiming memory, not files. It
>>>>> can take a long time for a GC to reclaim an object and you surely
>>>>> don't want a file locked for that long anymore than you want it held
>>>>> open forever. My point is, that it is a programming error to expect
>>>>> the GC be involved in reclaiming anything but memory. IMO, the best
>>>>> use of a finalizer is to error out if an object holding a resource
>>>>> hasn't been destructed, because there is obviously a programming
>>>>> error here and something has leaked. GCs aren't there to support
>>>>> sloppy programming. They are there to make your life easier and
>>>>> safer.
>>>>
>>>> An open file maybe, but why should the compiler decide the severity of
>>>> not closing the resource? What if the resource is just some
>>>> C-malloc'd memory?
>
> That's the only example of an nearly unlimited resource which I've heard
> thus far, but that raises the question, why the hell would you be using
> malloc if you're not going to free it, when you have a language with a
> gc? Effectively, the gc is freeing your malloced memory.
malloc/free is a lot more efficient than the GC. Partly on account of it
being so mature, and partly because it doesn't have to deal with GC-like
problems.
Kris of Tango made an allocator for tango.container that is extremely fast
based on malloc/free, but you are required to use it only for pure value
types (no references).
Another reason is to be able to use it in the finalizer, since malloc'd
memory will be valid. If, for instance, you registered some object with a
name, you need to have a malloc'd copy of the name to be able to
unregister it on finalization.
Finally, if the 3rd party library your using gives you malloc'd data, what
do you do then?
>> That's a possible solution. I just don't like the blanket assumptions
>> being made.
>
> Actually it's the absence of a use case.
>
> Hypothesis: if a finalizer is run, where it actually DOES something (as
> opposed to, for example, running a pile of asserts), there's always a
> bug.
>
> It's an extreme hypothesis, so it should be really easy to disprove.
> Can you come up with a counterexample?
Isn't it a bug to rely on finalization to tell you something is wrong with
your program? Essentially, if an object is finalized, and it must close
resources, you have two options: close the resources and continue silently
or loudly alert the user that there is a programming bug. Considering
that finalization is not guaranteed, that raises significantly the
potential of bugs escaping into shipping code because the "bad" case just
didn't get triggered. I'd say in most cases, the bad case isn't so bad.
What if a finalizer asserted things were closed, and then closed them if
they weren't. That way, you get asserts when not compiling in release
mode, and in release mode, the program soldiers on as best it can without
throwing seemingly random errors. It's just a thought. I don't like the
idea of throwing errors in the finalizer, because the error report can
possibly be completey decoupled from the source.
For an example, Tango manages all I/O with classes, and I've written code
that could run indefinitely opening and closing files continuously. I
never ran into resource problems. If all of a sudden it started
complaining that I wasn't closing the files, I'd question why someone put
in that change, since it was working fine before. I agree that the GC is
not the best place to rely on closing files, but it doesn't *hurt* to
close resources when you realize the last reference to that resource is
about to be eliminated.
-Steve
More information about the Digitalmars-d
mailing list