C++ 当新内存出现故障时,是否需要留出一些紧急内存?

C++ 当新内存出现故障时,是否需要留出一些紧急内存?,c++,linux,gcc,linux-mint,C++,Linux,Gcc,Linux Mint,假设我有一个使用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)

假设我有一个使用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内存用于类析构函数等,并优雅地退出程序

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

这样就有足够的EMERG_MEM_SZ内存用于类析构函数等,并优雅地退出程序

在尝试为析构函数提供这样的内存之前,您应该首先能够说明为什么析构函数首先需要分配动态内存。这样的要求对于班级的设计来说是一个严重的危险信号

当新内存出现故障时,是否需要留出一些紧急内存

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

另外,一些系统,特别是Linux,在特定的配置下,会过度占用内存,并且从不抛出std::bad_alloc。相反,分配总是成功的,直到实际访问物理内存时才分配物理内存,如果此时没有可用内存,则会终止进程或其他进程以释放一些内存。在这样的系统中,C++无法从内存不足中恢复。 这样就有足够的EMERG_MEM_SZ内存用于类析构函数等,并优雅地退出程序

在尝试为析构函数提供这样的内存之前,您应该首先能够说明为什么析构函数首先需要分配动态内存。这样的要求对于班级的设计来说是一个严重的危险信号

当新内存出现故障时,是否需要留出一些紧急内存

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

另外,一些系统,特别是Linux,在特定的配置下,会过度占用内存,并且从不抛出std::bad_alloc。相反,分配总是成功的,直到实际访问物理内存时才分配物理内存,如果此时没有可用内存,则会终止进程或其他进程以释放一些内存。在这种系统中,C++无法从内存不足中恢复。

< P>我不同意。 当应用程序内存不足并抛出异常时,堆栈将开始展开,从而在运行时销毁并释放内存。一般来说,析构函数不应该像释放内存一样使用动态内存分配

因此,如果您正确地使用了RAII,那么当堆栈展开时,您将获得内存,这可能允许您捕获并继续抛出的东西是一个可以丢弃结果的离散任务

此外,在大多数情况下,当操作系统试图整合内存以获得难以捉摸的插槽时,在实际抛出内存不足异常之前,应用程序将慢到无法使用的爬网状态。

我会说不

当应用程序内存不足并抛出异常时,堆栈将开始展开,从而在运行时销毁并释放内存。一般来说,析构函数不应该像释放内存一样使用动态内存分配

因此,如果您正确地使用了RAII,那么当堆栈展开时,您将获得内存,这可能允许您捕获并继续抛出的东西是一个可以丢弃结果的离散任务


此外,在大多数情况下,当操作系统试图整合内存以获得难以捉摸的插槽时,在实际抛出内存不足异常之前,应用程序将慢到无法使用的爬网状态。

这额外的内存有何帮助?它已经被分配了,所以它不像其他东西可以使用它。我认为,如果std::bad_alloc被抛出,您将遇到比使用紧急内存可能补救的问题多得多的麻烦。或者您试图分配比可用块更大的块,那么可以说您可以继续执行程序,如果您不需要它的话。或者你在尝试分配一些相对较小的东西时遇到了异常,在这种情况下,你的机器内存不足,你的程序几乎什么都做不了。坦白说,如果分配失败,你的进程可能会注定失败。很难从这样的事情中恢复过来。假设这是必要的,你尝试了这种方法。如果以后无法再次分配,会发生什么情况?是什么原因导致了记忆的重新保留?如果不是的话,它只会
当您确定错误不会从中完全恢复时,这是一个实用的解决方案。您将很快终止,以允许进行与清理相关的活动,如日志记录。据我所知,这是为数不多的几个使用案例之一。这个额外的内存会有什么帮助?它已经被分配了,所以它不像其他东西可以使用它。我认为,如果std::bad_alloc被抛出,您将遇到比使用紧急内存可能补救的问题多得多的麻烦。或者您试图分配比可用块更大的块,那么可以说您可以继续执行程序,如果您不需要它的话。或者你在尝试分配一些相对较小的东西时遇到了异常,在这种情况下,你的机器内存不足,你的程序几乎什么都做不了。坦白说,如果分配失败,你的进程可能会注定失败。很难从这样的事情中恢复过来。假设这是必要的,你尝试了这种方法。如果以后无法再次分配,会发生什么情况?是什么原因导致了记忆的重新保留?如果不是,那么只有当您确定错误不会从中完全恢复时,它才是一个实用的解决方案。您将很快终止,以允许进行与清理相关的活动,如日志记录。据我所知,这是为数不多的几个使用案例之一。我觉得缺乏记忆是一个被高估的问题。许多受到严格限制的平台可能在正常操作过程中或在不合理的用户请求时遇到这些问题。即使对于通常不会看到分配失败的平台,也没有理由放弃ship。我所看到的有内存池可供分配的唯一原因是创建一个消息窗口,通知用户即将退出。@Ripi2。你不需要为此而预留。在调用堆栈底部附近捕获由于堆栈展开而释放所有内存后,在几乎所有正常操作的应用程序中,您将有足够的内存用于消息窗口,即使发生了占用所有内存的泄漏,通常也会释放足够多的正常对象,这样就可以为消息框提供可用内存。我觉得内存不足是一个被高估的问题。许多受到严格限制的平台可能在正常操作过程中或在不合理的用户请求时遇到这些问题。即使对于通常不会看到分配失败的平台,也没有理由放弃ship。我所看到的有内存池可供分配的唯一原因是创建一个消息窗口,通知用户即将退出。@Ripi2。你不需要为此而预留。在调用堆栈底部附近捕获由于堆栈展开而释放所有内存后,在几乎所有正常操作的应用程序中,您将有足够的内存用于消息窗口,即使出现占用所有内存的泄漏,通常也会释放足够多的正常对象,以便现在可以为消息框提供可用内存。