I’m trying to implement a technique to test failing operator new
described in http://www.codeproject.com/Articles/6108/Simulating-Memory-Allocation-Failure-for-Unit-Test.
This is a sample code being tested:
VArray* arr = new VArray(1U, 3U, true);
I can make new
return NULL
instead of allocating memory. In this case, the program should continue to next line (which should test if arr == NULL
) and this is exactly what it does in MSVC.
However, the constructor of VArray
is still called after the failed new
in GCC. And since this
is NULL
, it results in SIGSEGV on the first assignment to a property. This seems to be a wrong behavior according to C++03 standard: https://stackoverflow.com/a/11514528/711006
My implementation of operators new
and delete
follows.
unsigned int OperatorPlainNewFailsAfter = UINT_MAX;
void* operator new(const size_t _size) throw()
{
void* result;
if(OperatorPlainNewFailsAfter == 0U)
{
result = NULL;
}
else
{
result = malloc(_size);
OperatorPlainNewFailsAfter--;
}
return result;
}
void operator delete(void* _memory) throw()
{
free(_memory);
}
What do I miss?