On Sunday, 20 September 2015 at 18:39:57 UTC, Adam D. Ruppe wrote:
On Sunday, 20 September 2015 at 18:34:37 UTC, Lambert Duijst wrote:
Oh that surprises me a bit, because I read in the list of deprecated features that delete is deprecated and that the right thing to do is to use destroy instead.

Right. One of the benefits of destroy is that it nulls the reference. Once you destroy it, you aren't supposed to use it again*. The zombie is kept around until the GC reaps it to protect against dangling pointers (somewhat), but you still aren't actually supposed to reuse it.

* If you really want to you can cheat by making a separate local variable to hold it before destroy it... destroy only nulls the variable you pass in, but I do not recommend doing this. Instead, you should reconstruct the object, even if implementing an object pool or something.

I use writeln("Address of s ", &s) to print the address, not sure if that is correct though.

that gives you the address of the local variable, not the reference. For address of the reference, try `cast(void*) s`.

An Object in D is like an Object* in C++. So when you & it, you get a pointer to a pointer.

Ah, that clarifies a lot ! Thanks. Also does destroy set all references to that object to null in this case there was only 1, but in a real program there can of course be many references to an object.

I wasn't interested in reusing an object after it was deleted, but more in the behaviour of a program if you do use it after a deletion. Just want to know if D protects against dangling pointers or is this just something you should never do.

If we are not supposed to use Object.destroy anymore then how can we still free non-memory resources that are held by classes (which are typically cg'ed) in a deterministic way ?

Reply via email to