全局关闭 C++ 新运算符异常

Posted

技术标签:

【中文标题】全局关闭 C++ 新运算符异常【英文标题】:Turn off C++ new operator exceptions globally 【发布时间】:2014-10-01 07:09:49 【问题描述】:

有没有办法全局关闭new 运算符的异常? 如果有多个,哪个是最好的?

我试过了,但我真的不确定:

#include <new>
using std::nothrow;

我尝试用谷歌搜索“使用 std::nothrow;”,但没有结果。

我正在使用 MSVC 2010。

我当然知道new (std::nothrow) myClass();

【问题讨论】:

我删除了那个。我主要考虑了第一部分,很抱歉我的想法不起作用.. 【参考方案1】:

没有。这会破坏很多代码,例如在标准头文件中,它确实依赖于new 抛出。

C++ 委员会意识到将数十种几乎兼容的语言标准化为一个名称所带来的危险,并且仅使用 5 个这样的选项,您就已经拥有 32 种不兼容的语言。

【讨论】:

你可以通过设置一个新的处理程序来确保你永远不会得到std::bad_alloc。但是当没有更多内存时,此函数不能导致operator new 返回nullptr。仅当它提供更多可用内存时才允许返回;否则,就会出现您所说的问题:所有标准库都会中断。 (大多数应用程序应该可能会安装一个新的处理程序;除非您有一些真正的策略来从bad_alloc 恢复,否则最好立即终止程序。)【参考方案2】:
#define NEW1(type, ...) new (std::nothrow) type(__VA_ARGS__)
#define NEW(type, size, ...) new (std::nothrow) type[size](__VA_ARGS__)

//用法:

int *a=NEW1(int),     //single non-initialized int
    *b=NEW1(int, 42), //single int with value 42
    *c=NEW(int, 42);  //array of ints made of 42 elements

delete a;
delete b;
delete[] c;

【讨论】:

嗨。请不要推荐使用宏编写代码的解决方案,除非问题特别要求这样做。按照您的建议,创建使用NEWNEW1 的客户端代码,这将强制您的整个代码库在项目的生命周期内支持这些宏。认为“只创建一个宏”会产生麻烦(并且会永久性地增加理解代码所需的工作量,对于整个代码库)。 这是一个有趣且棘手的解决方案。但是,是的,我不能将它添加到我的项目中......据我所知,最好的办法是避免使用宏。 根据定义,这不会全局关闭异常,而只会在使用宏的地方关闭。该宏不会比显式指定 std::nothrow 增加任何价值,但它确实会给维护程序员造成混乱。

以上是关于全局关闭 C++ 新运算符异常的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 C++ 新运算符用法 [重复]

用于堆内存分配的新运算符

如何模拟在函数中创建的类(新运算符)?

在搜索对话框中添加新运算符

MXNet常见问题1怎么创建新运算符(网络层)

MXNet常见问题1怎么创建新运算符(网络层)