我的程序调试期间是否可能导致内存泄漏?

时间:2009-12-04 14:41:22

标签: c memory-leaks

我正在开发Ubuntu 9.10

我正在编写一个C程序,在我的测试期间和debug我正在调用malloc并且总是记得调用free() - 这显然只是在调试期间。

我很好奇:我是否在吃掉每个调试会话系统所拥有的空闲内存?或者,在我从IDE关闭应用程序后,内核是否清理了进程内存?逻辑推理我很确定内核知道整个进程被杀死,因此知道它分配了什么内存,因此即使应用程序没有调用,内存仍然被释放。

我很感激解释。

谢谢你, 格言。

4 个答案:

答案 0 :(得分:7)

是的,操作系统将在程序停止运行时回收分配给程序的所有内存。

答案 1 :(得分:2)

你是对的。

这不是一个严重的问题,因为一旦你正在调试的程序被终止,任何'泄露'的内存都会被立即释放。

当进程长时间运行时,内存泄漏通常只是一个问题。

答案 2 :(得分:2)

内核在内核的内存中有一组进程记录,并跟踪每个进程,消耗的内存量,i / o,文件句柄或inode等资源。进程记录通常保存在一个队列中,其中内核的任务指针以永无止境的方式指向进程记录(这解释了为什么“多任务”的感知,它正在眨眼之间 - 这么快,实际上,它是在内核眼中进行单任务)。进程记录中有一个字段,用于说明所述进程占用了多少内存。

是的,内核确实将内存恢复到自己的池中,以备另一个进程使用。此外,正如John Weldon上面指出的那样,对于内存泄漏,你绝对是100%正确的。我在另一个posting中提到了这一点,因为每个malloc都有一个免费的,如果你没有内存泄漏的话。所以不要担心你的调试会话。这完全没问题,因为内核有责任确保回收内存。

必须彻底调试某些应用程序(尤其是守护程序)并且不会发生内存泄漏,因为守护程序将在下次重新引导之前运行很长时间。顺便提一下,在我最喜欢的书“专家C编程,深度C秘密 - 彼得范德林登”中提到过,在他进入Sun的一个阶段,有一个名为“printtool”的工具用于打印,但每隔一段时间队列堵塞,因为打印后台处理程序中存在内存泄漏,并且Sun机器的重新启动使其固化,他详细描述了内存泄漏。

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:1)

许多旧的Unix应用程序严重泄露内存,并依赖于进程结束清理。即使在那些日子的有限地址空间中,它通常也能很好地工作。当然,这不适用于长时间运行的应用程序。调试时我不担心内存泄漏的影响(泄漏本身就是bug,因此你需要在发布之前删除它们。)

在Unix中,以及我实际熟悉的所有其他当前操作系统中发生的事情是操作系统为进程分配内存。 malloc()从进程内存中获取内存,如果它要求超过进程可以提供的内存,则会从操作系统请求更多的进程内存。如果程序有内存泄漏,那么进程内存可以增长到系统允许的大小,但它是所有进程内存,并且当进程结束时所有分配都会消失。

我知道有些操作系统没有从已终止的进程中恢复内存,但我还没有看过一个或者在一个上面工作过。个人计算机(相对于特殊目的或企业计算机)的唯一操作系统是大量人们使用的Windows和Unix变体,并且这些操作系统将在流程结束时释放所有内存。