6

有这样的代码:

#include <iostream>

int main(){
    for(;;){
        int* ptr = new (std::nothrow) int;
        if(ptr == 0){
            std::cout << 0 << std::endl;
            break;
        }
    }
    std::cin.get();
    return 0;
}

然而,这个程序仍然抛出 std::bac_alloc 异常,尽管 new 是用 std::nothrow 参数调用的。这个程序是用Visual C++ 2010编译的,为什么会抛出异常?

编辑:

在 mingw 的 Windows 上使用 g++,一切正常。

4

3 回答 3

7

0必须格式化为"0". 这将占用几个字节;我敢打赌这就是原因。放一个断点std::bad_alloc::bad_alloc ,你肯定会知道的。

于 2011-09-26T12:57:13.403 回答
1

我刚刚从 VC2010 运行了您的示例。抛出的不是 new(nothrow) ,而是__security_check_cookie

于 2011-09-26T13:41:19.887 回答
-2

解释了为什么它仍在投掷以及如何让它不投掷。似乎nothrow只是被忽略了。

如果您仍然想要 C 运行时库的非抛出版本的 new,请将您的程序与 nothrownew.obj 链接。但是,当您与 nothrownew.obj 链接时,标准 C++ 库中的 new 将不再起作用。

我发现了一篇关于此的非常深入的文章,但它有点过时了(VC 6),但问题可能仍然存在。BTW VC 忽略所有throw()功能规范。

当 Operator new(std::nothrow) 无论如何都会抛出异常

于 2011-09-26T12:49:23.160 回答