On 2013-04-25 17:50, Volfram wrote:
I've run into a problem which I'd like to hope is a bug, but let's see if we can figure out if I'm doing something stupid first, eh?When a destructor calls a function from another module, I get an InvalidMemoryOperationError. When a destructor calls a function from another class in the same module, and that function calls the function I was trying to call initially, everything seems to go fine. When a destructor calls a function in the same class, which calls a function in a different module, I get the InvalidMemoryOperationError again. This may have to do with garbage collector subtleties I'm not familiar with. Example: File alpha.d module alpha; import beta; class AlphaClass { BetaClass bc; Alpha2Class a2c; void cleanup() { bc.cleanup();//if this is called from the destructor, expect an error. } public: this() { bc = new BetaClass(); a2c = new Alpha2Class(bc); } ~this { bc.cleanup();//this will cause an error. a2c.cleanup();//this works fine cleanup();//this will cause an error. } }
You cannot access GC controlled memory in class destructors. There's no guarantee in which order the destructors will be called. You don't know if the memory is still valid in a destructor.
-- /Jacob Carlborg
