digitalmars.D.learn - Is "delete" really going away?
- Minas Mina (37/37) Jul 29 2012 I think having the delete keyword for classes was a very good
- Timon Gehr (8/14) Jul 29 2012 import std.stdio;
- Simen Kjaeraas (12/17) Jul 29 2012 You should instead use destroy(instance). It will call the object's
- Minas Mina (5/5) Jul 29 2012 Thanks for the answers.
- bearophile (6/8) Jul 29 2012 Maybe to not silently break D code that uses delete, and allow
I think having the delete keyword for classes was a very good thing, altough I don't know the problems it has for the GC and probably other things. Consider this scenario: class Base { // ... } class Derived : Base { // ... FILE *f; this() { f = fopen(...); } ~this() { fclose(f); } } void main() { Base *b = new Derived(); delete b; // call the copy constructor b = // something else... } Having a destructor and that you know when is going to be called is VERY useful! So by removing the "delete" keyword, what happens? We won't have a way to destroy objects in a predictable way anymore? (I'm not talking about structs in any way). Thanks
Jul 29 2012
On 07/29/2012 03:03 PM, Minas Mina wrote:Having a destructor and that you know when is going to be called is VERY useful! So by removing the "delete" keyword, what happens? We won't have a way to destroy objects in a predictable way anymore? (I'm not talking about structs in any way). Thanksimport std.stdio; void main(){ auto c = new class{ ~this(){writeln("destroyed!");} }; version(future) destroy(c); else clear(c); } clear is being renamed to destroy starting from the next release IIRC.
Jul 29 2012
On Sun, 29 Jul 2012 15:03:09 +0200, Minas Mina <minas_mina1990 hotmail.co.uk> wrote:Having a destructor and that you know when is going to be called is VERY useful! So by removing the "delete" keyword, what happens? We won't have a way to destroy objects in a predictable way anymore? (I'm not talking about structs in any way).You should instead use destroy(instance). It will call the object's destructor and clear its vtable. If you need to release the memory too, you should probably use malloc and free, and std.conv.emplace. If you have a GC allocated object and want to reclaim the memory, core.memory.GC.free should do that. But if this is something you need to do, you've probably done something wrong somewhere. Oh, apparently, destroy() is called clear in 2.059. It's being renamed in the next version. -- Simen
Jul 29 2012
Thanks for the answers. So clear() or destroy() in 2.060 be used to call the destructor, but the actual memory of the object won't be freed, right? Is this is true, why wasn't "delete" changed to behave like destroy()?
Jul 29 2012
Minas Mina:Is this is true, why wasn't "delete" changed to behave like destroy()?Maybe to not silently break D code that uses delete, and allow easier future changes in the library/runtime code that implements destroy(). Bye, bearophile
Jul 29 2012