struct dynamic allocation error

Ali Çehreli via Digitalmars-d digitalmars-d at puremagic.com
Thu Sep 15 14:18:49 PDT 2016


On 09/15/2016 01:38 PM, Dechcaudron wrote:
> I believe there is some kind of weird issue that won't allow for struct
> instances to be dynamically allocated in a proper way via the 'new'
> keyword. It does actually allocate them and return a valid pointer to
> operate the instances, but whenever the program is exited I get the
> following exception:
>
> core.exception.InvalidMemoryOperationError at src/core/exception.d(693):
> Invalid memory operation
>
> Calling 'destroy' on the returned pointer only seems to set it to null,
> but it definitely doesn't call the destructor, neither does it prevent
> said exception from being raised. Code to reproduce:
>
> ```
> import std.conv;
> import std.stdio;
>
> struct Foo
> {
>     int a;
>
>     this(int a)
>     {
>         this.a = a;
>     }
>
>     ~this()
>     {
>         writeln("a is " ~ to!string(a));

That operation allocates from the GC, which is not allowed when GC is 
doing a collection. In this case, you can replace with the following:

     fprintf(stdout.getFP, "a is %d\n", a);

>     }
> }
>
> void main()
> {
>     Foo a = Foo(5);
>     Foo* b = new Foo(10);
>     writeln("Allocation complete");
>     destroy(b); //Does nothing

That's a common gotcha. Unfortunately, you're destroying the pointer 
itself. :/ Try this:

     destroy(*b);
     assert(b.a == int.init);

>     //Destructor for a is called
> }
> ```

I describe the destroy() with struct pointer problem here:

   http://ddili.org/ders/d.en/memory.html#ix_memory.destroy

Lastly, we have the Learn forum where this question would be more 
appreciated. :)

Ali



More information about the Digitalmars-d mailing list