InvalidMemoryOperationError when calling functions from destructors

Jacob Carlborg doob at me.com
Thu Apr 25 09:17:51 PDT 2013


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


More information about the Digitalmars-d mailing list