运算符new失败时的构造函数调用
Constructor call when operator new failed
我正在尝试实现一种技术来测试失败的运算符new
,如中所述http://www.codeproject.com/Articles/6108/Simulating-Memory-Allocation-Failure-for-Unit-Test.
这是一个正在测试的示例代码:
VArray* arr = new VArray(1U, 3U, true);
我可以让new
返回NULL
,而不是分配内存。在这种情况下,程序应该继续到下一行(应该测试arr == NULL
),这正是它在MSVC中所做的。
然而,在GCC中失败的new
之后,仍然调用VArray
的构造函数。由于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);
}
我想念什么?
C++标准要求分配函数(例如基本operator new
)在失败时抛出std::bad_alloc
异常,从而失败。不允许返回null指针。当您返回一个null指针时,您有未定义的行为,是的,一个可能的结果是调用了构造函数。
如果被调用的operator new
被声明为throw()
,那么编译器不检查空指针是错误的。但宣布一个非配售的新throw()
是违法的,所以编译器检查它没有意义;如果有什么不同的话应该在看到声明时进行投诉,因为隐式地声明非放置CCD_ 16。
如果你想测试new
是否失败(这是个好主意),CCD_ 18函数不应该返回空指针,但应该抛出CCD_ 19。否则,你就不会测试同样的东西。在您站点的页面上,测试代码而是使用新的放置。该代码仍然是非法的,因为他的operator new
可能返回空指针已经声明了函数throw()
,但这很容易固定的(或者没有。他叫::operator new
,而不是malloc
,用于实际分配,并且此函数可能投他还调用CCD_ 24函数进行分配,但使用了CCD_ 25算子去自由;如果你打电话::operator new
分配,您应该调用::operator
delete
释放。)当然,即使修复了,也不会测试任何有用的东西,因为你需要知道的是程序对std::bad_alloc
的反应是正确的,而不是对它永远看不到的空指针做出正确反应。
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 为什么智能指针不能在其构造函数中为我调用 new()?
- 使用 "new" 复制构造函数调用
- 运算符在C++中何时调用'new'构造函数
- 运算符new失败时的构造函数调用
- 调用'new'如何调用用户定义的放置分配函数?
- 当调用new函数时,返回地址值发生了什么?
- C++ 构造函数/析构函数调用 &对动态创建的数据调用"new"是否会删除旧数据?