Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用程序突然关闭时的堆内存清除_C++_Process_Operating System - Fatal编程技术网

C++ 应用程序突然关闭时的堆内存清除

C++ 应用程序突然关闭时的堆内存清除,c++,process,operating-system,C++,Process,Operating System,正如我们所知,堆用于为应用程序动态分配内存。在应用程序异常终止的情况下,如何清除堆内存(从而避免内存泄漏) 考虑以下场景: 假设一个应用程序在Windows或Linux上突然崩溃 我们在linux中强制杀死一个应用程序:kill-9 VisualStudio中的C++程序在执行中间引发错误。 在上述情况下,堆管理和清理有什么不同吗?[请在此添加更多可能感兴趣的用例场景] 这个问题出现在我的脑海中,因为我们总是谈论确保代码中不会发生内存泄漏。现在,我们如何处理在不调用内存释放调用的情况下强制

正如我们所知,堆用于为应用程序动态分配内存。在应用程序异常终止的情况下,如何清除堆内存(从而避免内存泄漏)

考虑以下场景:

  • 假设一个应用程序在Windows或Linux上突然崩溃
  • 我们在linux中强制杀死一个应用程序:
    kill-9
  • VisualStudio中的C++程序在执行中间引发错误。
在上述情况下,堆管理和清理有什么不同吗?[请在此添加更多可能感兴趣的用例场景]

这个问题出现在我的脑海中,因为我们总是谈论确保代码中不会发生内存泄漏。现在,我们如何处理在不调用内存释放调用的情况下强制关闭可能导致程序退出的应用程序的情况


如果这种内存泄漏重复发生,是否有可能操作系统的堆内存不足?或者操作系统是否有办法处理它…

无论进程如何关闭,从该进程分配的任何剩余内存都会在关闭时由操作系统内存管理器释放。在进程结束之前释放所有分配的内存是一种很好的做法,但在进程关闭后,操作系统/其他应用程序的可用堆是相同的。

至于动态内存管理,您应该使用(智能指针就是一个例子)在异常等情况下处理内存泄漏和管理。

在应用程序退出的情况下,操作系统只需收回它提供给进程的所有内存。操作系统不理解漏洞,它只是收回它提供给进程的内容。因此,本质上没有泄漏。所有内存都被回收。您可能会泄漏其他资源(文件描述符等),但巧妙地使用RAII应该可以防止这种情况。

假设操作系统是Unix或Windows的典型实现,则当应用程序被终止时,无论使用何种方法终止,操作系统都会释放堆内存

很明显,其他操作系统可能并没有做到这一点,这取决于每个操作系统以一种有意义的方式解决这个问题——我不知道有任何操作系统不会“在杀死进程后进行清理”,但我相信这种事情可能存在于这个世界的某个角落


编辑:可能还有其他不太容易释放的资源,例如共享内存或多个服务器使用的信号量。但大多数操作系统倾向于通过释放被终止应用程序的引用来处理这些问题,并让等待任何“可等待对象”(互斥、信号量等)的其他进程“让其运行”。

“堆通常在应用程序启动时由运行时分配,并在应用程序(技术上是进程)退出时回收”因此,异常/正常地终止/关闭应用程序不会泄漏任何内存。

附带说明的是,不会调用析构函数,因此,如果析构函数中有一些关键代码(如刷新到文件的缓冲区),则可能会导致糟糕的情况。是的,编写文件后半部分的代码的后半部分也可能尚未运行…-e、 g.“zip”写入大部分压缩文件,但不写入位于文件末尾的“目录”。。。如果代码崩溃或被终止[没有“捕获”失败],那么结果是“不完整”和“未定义的”。@Mats:谢谢您的输入。你的回答很有帮助。谢谢你的意见。我忽略了一点,即每个进程都有一个单独的堆空间。事实上,我曾经在一个实时操作系统上工作过,它没有为每个进程提供单独的堆空间(因为如果必须在跨越进程边界时分配和释放每条消息,则通过堆发送消息会变得混乱,因此最好有一个公共堆[对于一组进程或所有进程])。它在每个进程的基础上跟踪分配的内存,当进程退出/终止时,它将释放属于该进程的所有内存。所需的只是操作系统跟踪所有内存分配,而不是堆属于该进程。