String Appender Fails (Memory Allocation Failure)
Loopback
elliott.darfink at gmail.com
Wed Jul 13 16:11:34 PDT 2011
On 2011-07-14 01:11, Loopback wrote:
> Hello!
>
> I've been working on a project where I had to do all memory handling
> explicitly because no destructors were called. When I got too tired
> of the explicit memory handling I decided to trace what was causing
> this error. After hours of code stripping I had gotten myself a
> small concrete sample which could demonstrate the error.
>
> Now to the point; I create a program using WinMain as entry point. The
> program template i use, is identical to the win32 template on the
> D-Website. If you have used this template you know that all user code
> goes within the function "myWinMain". In this function I declare a class
> named Foo. When I create this class an empty constructor is called, and
> then the function "myWinMain" returns.
>
> Now the program calls Runtime.terminate, which is supposed to take
> care of the memory garbage and etc. This does not work. The terminate
> function call throws an Error, "Memory Allocation Failure".
> This failure originates in the 'Foo' destructor, which in turn creates
> a appender object of type string. My question is; how come this throws
> an error?
Not to forget the important part:
// Import WINAPI
import win32.windows;
// Core API
import core.runtime;
// For appender
import std.range;
extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int result;
void exceptionHandler(Throwable e) { throw e; }
try
{
Runtime.initialize(&exceptionHandler);
result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
Runtime.terminate(&exceptionHandler);
}
// If you use "Exception" object instead here, the program fails
// silently without any MessageBox of any kind. The program, in this
case quits
// automatically after about 7-12 seconds, without any destructors called.
// If you instead use Error object to catch the error, a message pops
// up saying, "Memory Allocation Failure", why?
catch (/*Exception*/Error o) // catch any uncaught exceptions
{
MessageBoxA(null, cast(char *) o.toString(), "Error", MB_OK |
MB_ICONEXCLAMATION);
result = 0;// failed
}
return result;
}
int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
Foo foo = new Foo;
return (foo !is null);
}
class Foo
{
public:
this()
{
}
~this()
{
// This line causes memory allocation failure
auto writer = appender!string();
}
}
More information about the Digitalmars-d-learn
mailing list