我将一个中等大小的应用程序从C转移到C ++。它不会处理异常,也不会改变。
我(错误!)对C ++的理解是(直到我昨天很难学会),(默认)new运算符在分配问题时返回NULL指针。然而,直到1993年(左右)才真实。如今,它会抛出一个std :: bad_alloc异常。
是否可以在不重写所有内容的情况下返回旧行为,在每次调用时使用std :: nothrow?
答案 0 :(得分:11)
你可以重载operator new:
#include <vector>
void *operator new(size_t pAmount) // throw (std::bad_alloc)
{
// just forward to the default no-throwing version.
return ::operator new(pAmount, std::nothrow);
}
int main(void)
{
typedef std::vector<int> container;
container v;
v.reserve(v.max_size()); // should fail
}
答案 1 :(得分:3)
包含标题<new>
。它包含一个你可以使用的“no-throw”版本的新版本:
#include <new>
int main() {
int* p = new(std::nothrow) int;
if (p) {
delete p;
}
}
编辑:
我承认我错过了问题的最后一句话。但说实话,我认为调整“普通new
”以达到标准前行为也不是一个好主意。我会研究某种自动搜索&amp;将每个new
转换为new(std::nothrow)
。
答案 2 :(得分:1)
很抱歉,但就我的观点而言,你不应该这样做,并回到旧的新行为。 这是因为你无论如何也无法避免异常。
为什么?
考虑新的调用,它应该用构造函数调用一些初始化代码来分配类,这些初始化代码需要构造任何动态的临时代码。唉,你会有例外。无论你使用std :: nothrow。这只是其中一种情况。
在斯科特迈耶斯的书Effective C++中,据我记得的那样详细讨论过。但是我不确定是否所有的案例都经过审查(但我建议的都是这些案例)。
答案 3 :(得分:1)
试一试:
1.定义一个在内存不足情况下要调用的函数。
2.将此函数传递给set_ new _handler函数,这样当new失败时,将调用此函数。
答案 4 :(得分:0)
您的编译器可能有一个命令行开关来启用/禁用此行为。