有这样的代码:
#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 ++,一切正常。
答案 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()
函数规范。