Advice wanted on garbage collection of sockets for c++ programmer using D
Moritz Maxeiner via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 27 18:11:35 PDT 2017
On Wednesday, 28 June 2017 at 00:05:20 UTC, Guillaume Piolat
wrote:
> On Tuesday, 27 June 2017 at 23:54:50 UTC, Moritz Maxeiner wrote:
>> - Replace calls by the GC to `~this` with calls to `finalize`
>> (or invent some cool other shortened name for the latter)
>
> My point is that in such a "finalize()" function the only sane
> things to do is to crash if the resource wasn't freed already.
> Why so?
>
> [...]
Not every class can't be finalized, so it might make sense for
finalization to remain an available option.
What I think reasonable is treating destruction and finalization
as two distinct things. This could look like the following:
---
// Does not refer to other GC memory, can be finalized
class File
{
private:
int fd;
public:
this() { fd = open(...); }
~this() { close(fd); }
// If the GC collects a File object that hasn't been
destroyed yet, it will call this finalizer,
// which *manually* calls the destructor (because it's safe
to do so in this case)
// A File object can still be manually `destroy`ed
beforehand, in which case this particular finalizer is still
safe, since an object won't be destroyed twice
finalize() { destroy(this); }
// Or maybe prettier: alias finalize = ~this;
}
class Foo
{
private:
File f;
public:
this() { f = new File(); }
// Make the process crash on finalization of an undestroyed
Foo object
@disable finalize();
}
---
>> - Reserve `~this` for being called by deterministic lifetime
>> management (std.experimental.allocator.dispose,
>> object.destroy, RefCounted, Unique, etc.)
>
> That's precisely what the GC-proof-resource-class allows, by
> preventing defective, non-composable usages of ~this.
The GC proof resource class idiom is a necessary hack, but it
*is* a hack with its own limitations (e.g. depending on Error
being catchable).
More information about the Digitalmars-d-learn
mailing list