Sense check: construction / deconstruction
Jordan Wilson
wilsonjord at gmail.com
Wed Apr 25 09:51:30 UTC 2018
On Tuesday, 24 April 2018 at 23:49:14 UTC, Steven Schveighoffer
wrote:
> What you are missing is that Database is pass-by-value, not a
> class. So when you include it directly in a class like you did
> in A, then when A's destructor is called, db's destructor is
> called.
>
> Since in the first case, a is being destroyed by the GC, you
> get the error.
Ok, this makes sense.
> In the second case (b), you aren't including the db by value,
> so no destructor is called from the GC. But this is dangerous,
> because db stops existing after main exits, but b continues to
> exist in the GC, so this is a dangling pointer.
If I set the pointer to null, before (b) is collected, would that
work?
> In the third case, scoped specifically destroys c when main
> exits, and you are not in the GC at that point.
>
> What the error message is telling you is you should manually
> clean up the database directly instead of leaving it to the GC.
> What is the correct path? probably the scoped!A version. Though
> I'm not sure what making copies of the database does in that
> library.
>
> -Steve
Ok I'll need to read the docs on scoped I think, but I think I
understand.
If I wanted db to be persistent, but have temporary objects
reference db without triggering GC collection of the db, you
would use scoped?
Or is this a situation where it's better to pass the db in
function calls to objects rather than set as a member of these
objects?
More information about the Digitalmars-d-learn
mailing list