How to call destructor before free without dropping @nogc?
Bienlein
ffm2002 at web.de
Thu Aug 19 08:25:23 UTC 2021
On Thursday, 19 August 2021 at 07:30:38 UTC, Bienlein wrote:
> Hello,
>
> I allocate some instance of class C manually and then free the
> memory again:
>
> class C {
> int num;
>
> ~this() {
> writeln("~this");
> }
> }
>
> void foo() // @nogc
> {
> auto mem = cast(C)malloc(__traits(classInstanceSize,
> C));
> auto c = emplace!(C)(mem);
>
> c.num = 789;
>
> destroy(c);
> free(cast(void*) c);
> c = null;
> }
>
> int main()
> {
> foo();
> }
>
> The code above works well as the destructor of c in class C is
> called by destroy. Problem is that destroy cannot be used once
> function foo is annotated with @nogc. There seems to be no way
> round it.
>
> What I want is to keep the function foo annotated with @nogc,
> but still have the destructor of C be called before free is
> called. Is there a way to call the destructor through meta
> programming or some kind of reflection so that I can create
> some generic function that calls the destructor and then free
> for any kind of class?
>
> Thanks, Bienlein
Oops, I just realized that you can also not call emplace when
@nogc is present. Well that is at least consistent with not
either being able to call destroy ;-).
So, I guess this means that you can forget about manually
allocating and freeing some instance of a class and using @nogc
as well. That's a pitty, @nogc was a good idea.
More information about the Digitalmars-d-learn
mailing list