有这样的代码:
#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++,一切工作正常。
发布于 2011-09-26 21:41:20
我刚从VC2010测试了你的样本。抛出的不是什么新的东西,而是__security_check_cookie。
发布于 2011-09-26 20:57:13
必须将0格式化为"0"。这将占用几个字节;我打赌这就是原因。在std::bad_alloc::bad_alloc上设置一个断点,你就可以确定了。
发布于 2011-09-26 20:49:23
This解释了为什么它仍然在抛出,以及如何让它不抛出。看起来nothrow就是被忽略了。
如果您仍然想要C运行时库的非抛出版本的
,请将您的程序与nothrownew.obj链接起来。但是,当您与nothrownew.obj链接时,标准C++库中的新功能将不再起作用。
我找到了一篇关于这方面的相当深入的文章,但它有点过时(VC6),但也许这个问题仍然存在。顺便说一句,VC忽略了函数的所有throw()规范。
When Operator new(std::nothrow) Throws an Exception Anyway
https://stackoverflow.com/questions/7555138
复制相似问题