How to call destructor before free without dropping @nogc?

Tejas notrealemail at gmail.com
Thu Aug 19 15:47:06 UTC 2021


On Thursday, 19 August 2021 at 09:39:26 UTC, evilrat wrote:
> On Thursday, 19 August 2021 at 08:25:23 UTC, Bienlein wrote:
>>
>> 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.
>
> you are probably doing something wrong, could you try @nogc 
> ctor?
>
> anyway @nogc is way too limiting, I don't see why bother when 
> there is already `scope` storage (should work in nogc) and -vgc 
> flag to show possible allocations.
>
> ```d
>
> import core.lifetime;
> import core.stdc.stdio;
> import core.stdc.stdlib;
>
> class SomeClass
> {
>     int a = 42;
>
>     this() @nogc { }
>     this(int val) @nogc { a = val; }
> }
>
>
>
> @nogc void main()
> {
> 	byte[64] mem;
> 	mem.emplace!SomeClass();
> 	printf("stack %d\n", (cast(SomeClass) mem.ptr).a); // 42
> 	
> 	scope a = new SomeClass();
> 	printf("scope %d\n", a.a); //42
> 	
> 	SomeClass dynAlloc = cast(SomeClass) 
> malloc(__traits(classInstanceSize, SomeClass));
> 	dynAlloc = emplace!SomeClass(dynAlloc, 123);
> 	printf("dynamic %d\n", dynAlloc.a); // 123
> }
> ```

Allocating to a function local variable via ```new``` always 
allocates on stack assuming no arguments are passed to new

Read sentence 6 of 
https://dlang.org/spec/expression.html#new_expressions

So
```d
scope a = new SomeClass();
```
actually allocates on stack


More information about the Digitalmars-d-learn mailing list