2010-06-04 35 views

回答

78

是的,“内存泄漏”只是进程不再提及的内存,因此不能再免费。 OS仍然跟踪分配给进程的所有内存,并在进程终止时释放它。

更新

在绝大多数情况下,操作系统将释放内存 - 这是正常的Windows,Linux,Solaris等的“口味”的情况下,不过需要注意的是,在很重要专用环境(如各种实时操作系统)时,程序终止时可能无法释放内存。

+2

问题:操作系统是否跟踪所有分配?您分配的任何堆内存都来自进程的虚拟内存空间 - 当进程终止时,该空间将返回给批量系统,对不对?我不明白为什么额外的簿记是必要的,因为进行分配的过程是唯一可以访问这些页面的过程(在用户区)。还是我被误导了? – 2010-06-04 16:11:27

+5

@Justin:不知道操作系统,我不认为这是有效的。也许明确地指定你正在谈论的操作系统。 – 2010-06-04 16:14:37

+1

注:标准对此没有提及。这也不能保证。即使不是全部,现代操作系统也是如此,但它们并不需要,过去也有那些既常见又不干净的操作系统。 – 2010-06-04 16:15:02

19

执行程序的操作系统通常会清理未明确释放的内存并处理未明确关闭的内存,但C++标准无法保证这一点。你可能会发现一些嵌入式设备不能释放你的内存泄漏。

这就是Windows和所有我见过的Linux发行版都可以释放内存泄漏。

虽然要自己测试一下,但您可以轻松创建巨大的内存泄漏循环。注意你的RAM使用量增长,然后关闭你的程序。您会看到RAM使用率回落。


另一个考虑用C时要考虑++的是,如果你不删除您堆中分配的内存那么你的析构函数也不会被调用。有时如果你的析构函数没有被调用,你也会有其他的副作用。

9

您是否在桌面操作系统(Windows,Linux等)上运行?如果是这样,是的,一般情况下,当程序退出时,系统将释放与程序相关的任何内存。

1

取决于您泄漏的内存。一些内存不能被操作系统回收。但是,大多数操作系统上的大多数内存会在进程退出时自动回收。

+5

某些内存无法被操作系统回收 - 比如说什么? – 2010-06-04 16:10:20

+1

在某些实时操作系统上,我看到特殊的以太网缓冲区块,在进程退出时不会清理干净。 – 2010-06-04 16:22:18

+1

共享内存通常也不会回收,因为您可能希望它持续使用临时进程。 – 2010-06-04 16:24:07

1

据我所知,一个现代化的操作系统将在程序终止后释放这个内存。

5

通常,是的。有些系统支持共享内存块,但程序退出时不会自动释放。大多数人仍然保留引用计数并在所有打开它的程序退出时将其删除,但有一些不会(例如,16位Windows有几种类型的项目即使没有任何引用时也会保留 - 但它通常会因其他原因而崩溃,然后才会导致问题累积......)

相关问题