On Monday, 16 August 2021 at 05:47:10 UTC, Mathias LANG wrote:
>On Monday, 16 August 2021 at 05:36:07 UTC, Tejas wrote:
>That is why I was using heapAllocate, because using new
on scope allocates exception on stack, and if you exit, then the exception is basically freed before it even gets caught. It fails even when you catch within the same function.
But allocate on heap and giving ownership to a scope
qualified variable is no problem at all. No signal 11
killing my process ^_^
You are relying on an accept-invalid though. The compiler should not accept that code, but currently erroneously does so.
okay that's it, the following is my final try for this thing:
import std;
import core.lifetime:emplace;
import core.stdc.stdlib:malloc,free;
T heapAllocate(T, Args...)(Args args)@nogc{
auto size = __traits(classInstanceSize, T);
auto memory = malloc(size)[0 .. size];
auto instance = emplace!(T,Args)(memory, args);
return instance;
}
void throws()@nogc{
auto/*no more scope*/ a = heapAllocate!(Exception)("works fine with scope, apparently");
throw a;
}
void main()@nogc
{
try{
throws();
} catch(Exception exp){
scope(exit)free(cast(void*)exp);//new code
printf("%s", cast(char*)exp.msg);
}
}
There are 0 problems with this, right? I just have to remember to free the exception in the catch
?