gpt4 book ai didi

c++ - operator new 重载c++,处理失败无一异常(exception)

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:27 36 4
gpt4 key购买 nike

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

我希望它像这样工作:

myObject = new object(...);
if (NULL == myObject)
printf("error")
else
do something

谢谢!

最佳答案

你需要调用new (nothrow),像这样:

myObject* = new (std::nothrow) myObject(...);

然后,您不需要覆盖常规的 operator new,而是需要覆盖采用 std::nothrow_t 的那个。有关更多信息,请参见此处:http://www.cplusplus.com/reference/new/nothrow/

没有 nothrow 的常规 operator new 不应该在失败时返回 null,而应该抛出。由于不允许抛出,因此无法实现这些运算符(除非在失败或类似情况下调用 abort())。

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

关于c++ - operator new 重载c++,处理失败无一异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760563/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com