具有nothrow选项的operator new仍会抛出异常

时间:2011-09-26 12:35:41

标签: c++ exception new-operator nothrow

有这样的代码:

#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异常,尽管使用std :: nothrow参数调用new。此程序在Visual C ++ 2010中编译。为什么抛出异常?

编辑:

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

3 个答案:

答案 0 :(得分:7)

0必须格式化为"0"。那将需要几个字节;我敢打赌这是原因。在std::bad_alloc::bad_alloc上设一个断点,你肯定会知道。

答案 1 :(得分:1)

我刚刚从VC2010运行了您的样本。它不是新的(不是)抛出,而是__security_check_cookie

答案 2 :(得分:-2)

This解释了为什么它还在扔,以及你怎么能让它不扔。似乎nothrow被忽略了。

  

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

我发现了一篇相当深入的文章,但它有点过时了(VC 6),但问题可能仍然存在。 BTW VC忽略所有throw()函数规范。

When Operator new(std::nothrow) Throws an Exception Anyway