c++ - 使用 operator new/malloc 分配的内存块能否在程序执行结束后持续存在?

标签 c++ c dynamic-memory-allocation

Possible Duplicate:
When you exit a C application, is the malloc-ed memory automatically freed?

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

int *ip = new int(8);

在我的程序终止后仍然存在?

最佳答案

简短回答:不。

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

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

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

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

关于c++ - 使用 operator new/malloc 分配的内存块能否在程序执行结束后持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383401/

相关文章:

c++ - 为什么此 C++ 代码会导致运行时错误?

c++ - 无法调用函数引用 c++

c++ - 如何使用 std::vector 处理错误?

linux - 为什么我执行的 sbrk 系统调用不起作用?

C++ 与动态内存分配混淆

android - Android 上 Qt 5.3 RC 中的 QtPositioning 错误

抽象基类的 C++ 函数

c - 使用指针和数组时出现奇怪的结果

C程序寻找堆栈增长的方向

在 C 中将大十进制输入转换为 256 位数组中的十六进制输出