如果我编程 - 不知道它 - 内存泄漏,应用程序终止,泄漏的内存是否释放?程序退出时泄漏的内存是否释放?
回答
是的,“内存泄漏”只是进程不再提及的内存,因此不能再免费。 OS仍然跟踪分配给进程的所有内存,并在进程终止时释放它。
更新
在绝大多数情况下,操作系统将释放内存 - 这是正常的Windows,Linux,Solaris等的“口味”的情况下,不过需要注意的是,在很重要专用环境(如各种实时操作系统)时,程序终止时可能无法释放内存。
执行程序的操作系统通常会清理未明确释放的内存并处理未明确关闭的内存,但C++标准无法保证这一点。你可能会发现一些嵌入式设备不能释放你的内存泄漏。
这就是Windows和所有我见过的Linux发行版都可以释放内存泄漏。
虽然要自己测试一下,但您可以轻松创建巨大的内存泄漏循环。注意你的RAM使用量增长,然后关闭你的程序。您会看到RAM使用率回落。
另一个考虑用C时要考虑++的是,如果你不删除您堆中分配的内存那么你的析构函数也不会被调用。有时如果你的析构函数没有被调用,你也会有其他的副作用。
您是否在桌面操作系统(Windows,Linux等)上运行?如果是这样,是的,一般情况下,当程序退出时,系统将释放与程序相关的任何内存。
取决于您泄漏的内存。一些内存不能被操作系统回收。但是,大多数操作系统上的大多数内存会在进程退出时自动回收。
某些内存无法被操作系统回收 - 比如说什么? – 2010-06-04 16:10:20
在某些实时操作系统上,我看到特殊的以太网缓冲区块,在进程退出时不会清理干净。 – 2010-06-04 16:22:18
共享内存通常也不会回收,因为您可能希望它持续使用临时进程。 – 2010-06-04 16:24:07
据我所知,一个现代化的操作系统将在程序终止后释放这个内存。
通常,是的。有些系统支持共享内存块,但程序退出时不会自动释放。大多数人仍然保留引用计数并在所有打开它的程序退出时将其删除,但有一些不会(例如,16位Windows有几种类型的项目即使没有任何引用时也会保留 - 但它通常会因其他原因而崩溃,然后才会导致问题累积......)
- 1. 检测退出时释放的C内存“泄漏”
- 2. 内存泄漏 - 释放calloc
- 3. 线程中的Perl内存泄漏(线程不释放内存)
- 4. FileMaker的ODBC驱动程序不释放句柄(内存泄漏)
- 5. CGImageRef释放和autoreleasepool后内存泄漏
- 6. gtk_file_chooser_get_filename,结果未释放,内存泄漏?
- 7. 内存泄漏 - 释放和删除
- 8. 内存泄漏自动释放崩溃
- 9. 内存泄漏释放字符数组
- 10. CFMutableDataRef释放,但仍使内存泄漏
- 11. 尽管释放内存泄漏struct
- 12. 释放内存泄漏警告但不是自动释放内存泄漏警告
- 13. os.walk是否泄漏内存?
- 14. System.Diagnostics.EventLog是否泄漏内存?
- 15. 泄漏工具没有发现泄漏,但内存不释放
- 16. Java在释放线程时泄漏堆内存
- 17. WebAssembly程序能否泄漏内存?
- 18. 内存泄漏 - 应用程序退出信号9
- 19. Python 3解释器在嵌入时是否泄漏内存?
- 20. Golang程序内存泄漏?
- 21. 内存泄漏Node.js程序
- 22. 是不是释放TMemoryStream导致内存泄漏?
- 23. 是否有退出android应用程序后释放硬件加速的内存。
- 24. 内存泄漏,尽管释放分配的内存
- 25. windows pthread中的内存泄漏。 `pthread_join`不释放内存
- 26. iPhone内存泄漏和释放的问题排序数组
- 27. boost'ptr_container泄漏'释放'?
- 28. 当程序退出时,堆是否被释放?
- 29. pthread_mutex_t *在程序中止或退出时是否释放?
- 30. 在重用之前释放的对象的潜在泄漏和退出时释放的内容
问题:操作系统是否跟踪所有分配?您分配的任何堆内存都来自进程的虚拟内存空间 - 当进程终止时,该空间将返回给批量系统,对不对?我不明白为什么额外的簿记是必要的,因为进行分配的过程是唯一可以访问这些页面的过程(在用户区)。还是我被误导了? – 2010-06-04 16:11:27
@Justin:不知道操作系统,我不认为这是有效的。也许明确地指定你正在谈论的操作系统。 – 2010-06-04 16:14:37
注:标准对此没有提及。这也不能保证。即使不是全部,现代操作系统也是如此,但它们并不需要,过去也有那些既常见又不干净的操作系统。 – 2010-06-04 16:15:02