假设我有一个使用“ 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,但我想这个问题可能适用于任何平台。
答案 0 :(得分:5)
是否有足够的(EMERG_MEM_SZ)内存用于类析构函数等,并可以正常退出程序?
在尝试为析构函数提供此类内存之前,您应该首先能够辩解析构函数首先需要分配动态内存的某些原因。这样的要求是对班级设计的严重警告。
当新的失败时是否有必要保留一些紧急存储器?
不一定。首先,通常可以在不分配任何动态内存的情况下正常退出。其次,在缺乏内存的严峻情况下,在操作系统保护下运行的程序不一定需要优雅地终止。
P.S。某些系统(尤其是Linux,具有特定配置)会“过量使用”内存,并且永远不会抛出std::bad_alloc
。相反,分配总是成功的,物理内存直到实际访问才分配,并且如果那时没有可用的内存,则该进程(或其他进程)将被杀死以释放一些内存。在这样的系统上,C ++无法从内存不足中恢复。
答案 1 :(得分:2)
我会拒绝。
当您的应用程序内存不足并引发异常时,堆栈将开始释放(从而破坏并释放内存)。通常,析构函数不应像释放内存那样使用动态内存分配。
因此,如果您正确使用了RAII,那么随着堆栈释放,您将获得内存,这有可能使您能够捕获并继续(如果抛出的事情是离散的任务,其结果可以被丢弃)。
在大多数情况下,您的应用程序在实际引发内存不足异常(因为操作系统会尝试整合内存以使您获得难以捉摸的插槽)之前很长一段时间,就会慢到无法使用的爬网速度。