On Friday, 13 February 2015 at 19:03:10 UTC, Jonathan Marler
wrote:
This question comes from wanting to be able to throw an
exception in code that is @nogc.
I don't know if it's possible but I'd like to be able to throw
an exception without allocating memory for the garbage
collector? You can do it in C++ so I think you should be able
to in D. One idea I had was to allocate the memory for the
Exception beforehand and create the Exception class with the
pre-allocated memory. I came up with the following code:
T construct(T,A...)(void* buffer, A args)
{
return (cast(T)buffer).__ctor(args);
}
Now to test it:
void main()
{
ubyte[ __traits(classInstanceSize, Exception)]
exceptionBuffer;
throw construct!(Exception)(exceptionBuffer.ptr, "My
Exception Allocated on the STACK!");
}
I got an assertion error. I'm not sure why, but when I print
out the contents of the buffer of my stack exception it differs
from an exception created for the garbage collector with "new".
It looks like it has some accounting information embedded in
the class instance. I figured as much but I didn't think the
code that performs the "throw" would be dependent on this.
Also, this doesn't look like a very safe option because the
initial values for the class members don't get set using this
"construct" template.
If anyone has any other ideas or a way to fix mine let me know,
thanks.
1. Throw preallocated exceptions is the way to go
2. Allocating them on the stackframe that will cease to exist by
throwing is a bad idea
3. use emplace
To construct a type in preallocated memory