避免使用std :: bad_alloc。 new应返回NULL指针

时间:2009-11-10 09:54:14

标签: c++ c memory-management

我将一个中等大小的应用程序从C转移到C ++。它不会处理异常,也不会改变。

我(错误!)对C ++的理解是(直到我昨天很难学会),(默认)new运算符在分配问题时返回NULL指针。然而,直到1993年(左右)才真实。如今,它会抛出一个std :: bad_alloc异常。

是否可以在不重写所有内容的情况下返回旧行为,在每次调用时使用std :: nothrow?

5 个答案:

答案 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)

您的编译器可能有一个命令行开关来启用/禁用此行为。