free causes exception

ZombineDev via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 26 13:47:16 PST 2016


On Tuesday, 26 January 2016 at 21:23:28 UTC, Igor wrote:
> On Tuesday, 26 January 2016 at 20:17:20 UTC, Steven 
> Schveighoffer wrote:
>> 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.
>
> um? Memory manager? I am doing it manually C++ style so I don't 
> have to worry about the god forsaken memory manager. Why is it 
> so difficult? I create the object and release it when I need to.
>
> I can replace the destroy(f) with free(inline the code) but I 
> don't see why that should matter. The whole point of 
> destructors is to do this sort of stuff. That's why they were 
> invented in the first place!?!

Why not simply:
class Foo { this(Arg1, Arg2) { ... } ... }

// Option A:
import std.typecons : scoped;
auto foo = scoped!Foo(arg1, arg2);

// Option B:
import std.experimental.allocator : make, dispose;
import std.experimental.allocator.mallocator;
auto foo = Mallocator.instance.make!Foo(arg1, arg2);
scope(exit) Mallocator.instance.dispose(foo);

http://dlang.org/phobos/std_typecons#.scoped
http://dlang.org/phobos/std_experimental_allocator


More information about the Digitalmars-d-learn mailing list