【发布时间】:2023-03-29 05:28:01
【问题描述】:
我正在尝试实现一种技术来测试 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异常。此要求绑定到此函数的替换版本。”