我正试图实施一项技术来测试http://www.codeproject.com/Articles/6108/Simulating-Memory-Allocation-Failure-for-Unit-Test中描述的失败运算符new
。当新操作员失败时的构造函数调用
这是被测试的样本代码:
VArray* arr = new VArray(1U, 3U, true);
我可以做,而不是分配内存new
回报NULL
。在这种情况下,程序应该继续到下一行(应测试是否为arr == NULL
),这正是MSVC中的做法。
但是,VArray
的构造函数仍然在GCC中失败的new
之后调用。并且因为this
是NULL
,它会在第一次分配给属性时产生SIGSEGV。这似乎是错误的行为根据C + + 03标准:https://stackoverflow.com/a/11514528/711006
我的实施运营商new
和delete
下面。
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);
}
我想念什么?
替换'operator new'必须在失败时抛出'std :: bad_alloc'。返回NULL值违反了合同。“需要的行为:返回一个非空指针到合适对齐的存储区(3.7.4),否则抛出一个'bad_alloc'异常。**这个需求绑定到这个函数的替换版本**上。 – 2014-10-20 08:50:56