新的失败时是否有必要保留一些紧急存储器?

时间:2018-09-24 16:38:13

标签: c++ linux gcc linuxmint

假设我有一个使用“ new”的函数,是否需要留出一些紧急存储器以防“ new”失败?如:

static char* emerg_mem = new char[EMERG_MEM_SZ];

FooElement* Foo::createElement()
{
    try
    {
        FooElement* ptr;
        ptr = new FooElement();
        return ptr;
    }
    catch(bad_alloc ex)
    {
        delete[] emerg_mem;
        emerg_mem = NULL;
        return NULL;
    }
}

是否有足够的(EMERG_MEM_SZ)内存用于类析构函数等,并可以正常退出程序?

我在Linux Mint上使用GCC,但我想这个问题可能适用于任何平台。

2 个答案:

答案 0 :(得分:5)

  

是否有足够的(EMERG_MEM_SZ)内存用于类析构函数等,并可以正常退出程序?

在尝试为析构函数提供此类内存之前,您应该首先能够辩解析构函数首先需要分配动态内存的某些原因。这样的要求是对班级设计的严重警告。

  

当新的失败时是否有必要保留一些紧急存储器?

不一定。首先,通常可以在不分配任何动态内存的情况下正常退出。其次,在缺乏内存的严峻情况下,在操作系统保护下运行的程序不一定需要优雅地终止。


P.S。某些系统(尤其是Linux,具有特定配置)会“过量使用”内存,并且永远不会抛出std::bad_alloc。相反,分配总是成功的,物理内存直到实际访问才分配,并且如果那时没有可用的内存,则该进程(或其他进程)将被杀死以释放一些内存。在这样的系统上,C ++无法从内存不足中恢复。

答案 1 :(得分:2)

我会拒绝。

当您的应用程序内存不足并引发异常时,堆栈将开始释放(从而破坏并释放内存)。通常,析构函数不应像释放内存那样使用动态内存分配。

因此,如果您正确使用了RAII,那么随着堆栈释放,您将获得内存,这有可能使您能够捕获并继续(如果抛出的事情是离散的任务,其结果可以被丢弃)。

在大多数情况下,您的应用程序在实际引发内存不足异常(因为操作系统会尝试整合内存以使您获得难以捉摸的插槽)之前很长一段时间,就会慢到无法使用的爬网速度。