free causes exception

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 26 12:17:20 PST 2016


On 1/26/16 9:20 AM, Igor wrote:
> I have successfully malloc'ed an object but when I go to free it in the
> destructor I get an exception. The destructor simply has
>
> ~this() // destructor for Foo
> {
>      core.stdc.stdlib.free(&this);
> }
>
>
> auto buffer = core.stdc.stdlib.malloc(__traits(classInstanceSize,
> App))[0..__traits(classInstanceSize, App)];
> auto app = cast(App)emplace!App(buffer[]);
>
> I tried to retain a ptr to buffer and free that but still no good. I
> also get a depreciation warning that &this is not an lvalue. Hopefully I
> don't have to keep a ptr around to this simply to free it and avoid
> future issues?
>
> So how am I suppose to free an object?

Don't do it in the destructor.

I can only imagine that you are triggering the destructor with destroy? 
In this case, destroy is calling the destructor, but then tries to zero 
the memory (which has already been freed).

There is a mechanism D supports (but I believe is deprecated) by 
overriding new and delete. You may want to try that. It's deprecated, 
but has been for years and years, and I doubt it's going away any time soon.

A class shouldn't care how it's allocated or destroyed. That is for the 
memory manager to worry about.

-Steve



More information about the Digitalmars-d-learn mailing list