使用运算符 new/malloc 分配的内存块是否可以在程序执行结束后持续存在



可能的重复项:
退出 C 应用程序时,是否会自动释放错误分配的内存?

当我读到在 C/C++ 中动态内存分配时,分别使用 delete/free 是多么强制性时,我想到了这个问题。我想如果内存分配在我的程序执行终止后仍然存在,那么是的,它是强制性的;否则,我为什么要担心释放分配的空间?操作系统不会通过进程终止自动释放它吗?我说得有多对?我的问题是可以

int *ip = new int(8);

在我的计划终止后仍然存在?

简短回答:不。

长答案:不,C++永远不会持久内存,除非你做工作来让它这样做。释放内存的原因是:

如果您不释放内存,而是继续分配它,您将在某个时候耗尽。一旦你用完了,几乎任何事情都可能发生。在 Linux 上,也许 OOM 杀手被激活了,你的进程被杀死了。也许操作系统将您完全分页到磁盘。如果您使用足够的内存,也许您会给Windows框一个蓝屏。它几乎可以被认为是未定义的行为。此外,如果你泄漏了内存,它只是坐在那里,未使用的,未释放的,在你的进程终止之前,没有人可以使用它。

还有另一个原因。当您向分配器释放内存时,分配器可能会保留它,但只是将其标记为可用。这意味着下次你需要记忆时,它已经坐在那里等着你了。这意味着对内核请求内存的调用更少,从而提高了性能,因为上下文切换效率非常低。

编辑:C和C++标准甚至不能保证在终止后操作系统会清理内存。许多操作系统和编译器可以,但不能保证。尽管如此,所有主要的桌面和移动操作系统(DOS和一些非常旧的嵌入式系统除外)都会在进程内存之后清理

在程序退出之前,您无需将内存释放回操作系统,因为操作系统将在进程终止时回收已分配给进程的所有内存。如果分配流程完成之前所需的对象,则不必释放它。

话虽如此,无论如何释放内存仍然是一个好主意:如果您的程序大量使用动态内存,则几乎肯定需要运行内存分析器来检查内存泄漏。分析器会告诉您最后没有释放的块,您需要记住忽略它们。将泄漏数量保持在零要好得多,原因与消除 100% 的编译器警告相同。

对于历史说明:旧的 Amiga 计算机("AmigaOS")使用的操作系统没有现在假设的完整内存管理(除了 Amiga 不再流行时发布的一些更高版本)。

CPU没有MMU(内存管理单元),因此每个进程都可以访问所有物理内存。因此,当两个进程想要共享一些信息时,它们只能交换指针。这种做法甚至受到操作系统的鼓励,操作系统在其消息传递方案中使用了这种技术。

但是,这使得无法跟踪哪个进程拥有内存的哪个部分。因此,操作系统不会释放已完成进程(或任何其他资源)的内存。因此,释放所有分配的内存至关重要。

1) 当你请求离开堆时释放内存。内存泄漏从来都不是一件好事。如果它现在不伤害你,它很可能会走上这条路。

2) C 或 C++ 不能保证您的操作系统会为您清理内存。有一天,您可能正在一个实际上没有编程的系统。或者更糟糕的是,您可能正在将不关心内存泄漏的代码移植到这个新平台。

任何好的操作系统都应该在进程退出时清理所有资源; "始终释放您分配的内容"原则适用于两件事:

  1. 如果您的程序泄漏内存但从未退出(守护程序、服务器等),则不断泄漏内存将严重浪费 RAM。

  2. 你不应该推迟释放所有内存,直到你的程序终止(就像Firefox有时所做的那样 - 注意到它退出需要多少时间?) - 重点是尽量减少你分配内存的时间;即使你的程序继续运行,你也应该在完成它后立即释放分配的RAM。

如果您非常确定在程序的生命周期中永远不需要释放内存,那么从技术上讲,跳过释放/删除可能是可以的。Linux,Windows等操作系统将在进程结束时释放分配的内存。但实际上,您几乎永远不能假设您分配的内存不需要在进程的生命周期内释放。牢记代码的可重用性、可维护性和可扩展性,最好始终释放在适当位置分配的所有内容。

这是一个有趣的问题。我对你的问题的最初看法是,你是否可以在程序完成后访问内存,但第二次阅读后,我看到你想知道为什么要释放内存。

释放动态分配的内存,因为如果不这样做,操作系统和其他进程将耗尽,您将不得不重新启动。

我以为您可能希望在程序完成后访问该内存,所以我的猜测是,即使您将动态分配的内存块的起始地址和长度写到控制台或文件中,该地址在程序完成后也可能无效。

这是因为当您的程序运行时,您有一个虚拟页面地址,在程序完成后,如果没有内核权限,您可能无法触摸该地址。或者,还有另一个原因。

它肯定不会在程序终止后存活下来。这个想法是在不再需要时释放内存,这样你的程序就不会浪费内存(它不会消耗比它真正需要的更多),或者更糟糕的是,不会耗尽内存(取决于你的分配模式)

你必须担心它,因为想象一下你在很多地方分配了大量内存,而不是释放它。分配内存后,它将占用无法再分配的部分内存。这将导致可用内存量每次变得越来越小,因为您无法释放它。在某些时候,内存将耗尽。即使在程序终止时释放了内存,也假设您的程序一次运行数周,不断分配内存但从不释放内存。内存是有限的资源,在使用动态分配时需要负责。

最新更新