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