我知道,根据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];

下面是进一步阅读

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top