将新返回NULL在任何情况下?
-
23-08-2019 - |
题
我知道,根据C++标准的情况下,新的未分配储它应该扔std::bad_alloc异常.但我听说,某些编译器,如VC6(或CRT实施?) 不遵守它。这是真的吗?我问这个是因为检查空之后,每一个新的声明的代码看起来非常难看。
解决方案
VC6是不符合的默认在这个方面。VC6的 new
返回 0
(或 NULL
).
这里是Microsoft的KB条在这个问题及其建议的解决方法的使用定义 new
处理程序:
如果你有老的代码写的VC6的行为,你可以得到相同的行为与新MSVC编(喜欢的东西7.0和以后)通过连接在一目文件命名为 nothrownew.obj
.实际上有一个 相当复杂的规则 在7.0和7.1汇编者(VS2002和VS2003),以确定它们是否违约以非投掷或投掷的 new
.
它似乎 MS清理这个了 在8.0(VS2005)—现在它总是默认为一种投掷新的除非你具体地链接 nothrownew.obj
.
注意,你可以指定你想要的 new
返回 0
而不是扔 std::bad_alloc
使用 std::nothrow
参数:
SomeType *p = new(std::nothrow) SomeType;
这似乎是工作在VC6,所以它可能是一种方式或多或少机械修复代码的工作同所有编译器,所以你不必改现有的错误处理。
其他提示
我想补充的(有点争议)认为,检查空后的分配尝试几乎是徒劳的。如果你的程序不断运行到这种情况,很可能是你不能这样做比退出快速得多。这是非常有可能的任何后续分配尝试也将失败。
,不检查NULL,您的后续代码将试图取消引用NULL指针,这趋向于快速退出程序,具有相对独特的(和可调试容易)退出条件。
我并不想谈论你出去检查空的,它肯定是认真的规划。但你不从中收获很多,除非在非常特殊的情况下,可以或许存储一些恢复信息(不分配更多的内存),或免费的不太重要的内存等,但这些情况将是对大多数人来说比较少见。
鉴于此,我只相信编译器抛出bad_alloc的,个人 - 至少在大多数情况下
基于C ++规范,它总是会抛出的std :: bad_alloc的当您使用只是普通的新没有PARAMS,当然可以有一些不符合标准的编译器。
我不会代码为符合非C ++标准的编译器虽然。 VC6是在这方面的其中之一。
这是很好的做法,虽然始终设置指针为NULL删除它们后。所以,正因为如此,检查NULL仍然需要。
话虽这么说,这里有几个选项来清理你的代码:
选项1:设置自己的新的处理程序
要清理你的代码中的安全的方法是拨打:的 set_new_handler 第一。
然后,你可以在你的处理器检查NULL,并抛出的std :: bad_alloc的存在,如果返回NULL。
如果你想更好的例外,那么这是你最好的选择。如果你喜欢NULL更好的回报,那么你也可以这样做,这样会在新的处理程序中一个陷阱。
方法2:使用新重载强>
C ++标准头文件定义一个结构抛出异常,其是空的。您可以使用此结构中新的对象来获取它的重载版本,它总是返回NULL。
void* operator new (size_t size, const std::nothrow_t &);
void* operator new[] (void *v, const std::nothrow_t &nt);
因此,在你的代码:
char *p = new(std::nothrow) char[1024];
下面是进一步阅读 良好的refrence p>