运算符新重载c ++,无异常处理失败

use*_*972 1 c++ operator-overloading new-operator

我正在开发一个不使用异常的项目,应该保持这种状态.为了使用我自己的内存管理器,我重载(overrid可能更正确)new运算符.在我的内存管理器中,如果分配失败 - 返回NULL.现在altough new运算符返回NULL,正在调用构造函数,然后我得到一个seg错误,因为我没有分配内存.我想要的功能是如果new运算符返回NULL,则不应该调用构造函数(之后我会检查对象是否已成功初始化).

我希望它能像这样工作:

myObject = new object(...);
if (NULL == myObject)
    printf("error")
else
    do something
Run Code Online (Sandbox Code Playgroud)

谢谢!

Joh*_*nck 7

你需要调用new (nothrow),如下所示:

myObject* = new (std::nothrow) myObject(...);
Run Code Online (Sandbox Code Playgroud)

然后,而不是覆盖常规,operator new你需要覆盖所采取的那个std::nothrow_t.有关详细信息,请参阅此处:http: //www.cplusplus.com/reference/new/nothrow/

常规operator newwithout nothrow不应该在失败时返回null,而应该抛出.由于您不允许抛出,因此您无法实现这些运算符(除非通过调用abort()失败或类似的东西).

最后,在编译期间完全禁用异常可能会有所帮助.我希望当时会发现这种错误(我不确定).

  • 这不是唯一的方法,尤其是当您正在编写自己的 `operator new` 时。[basic.stc.dynamic.allocation]p3 *"如果一个具有非抛出异常规范的分配函数分配存储失败,它将返回一个空指针。任何其他分配存储失败的分配函数只能通过抛出与 `std::bad_alloc` 类型的处理程序匹配的类型的异常。"* (2认同)
  • `std::nothrow_t` 不是异常规范。另外,我在我的引文中删除了一个参考:在 *"non-throwing exception specficiation"* 之后,[basic.stc.dynamic.allocation]p3 指的是 [except.spec],这是关于“异常规范”的部分。虽然你不能用 `noexcept` 替换默认的 `operator new(size_t)`,你可以为 `noexcept` 的类类型编写自定义分配函数。 (2认同)
  • 在 C++03 中,相同的段落是: *“如果使用空异常规范(15.4)`throw()` 声明的分配函数未能分配存储空间,它将返回一个空指针。”* (2认同)