运行一段固定的时间然后终止的程序,大多不需要担心如何释放内存,当程序停止时所分配的内存会被自动回收。而当程序的生存时间要长一点,这就需要管理动态内存的分配和回收。这时在使用malloc()和free()时就要非常慎重。堆经常会出现两种类型的问题:
1.释放或者改写仍在使用的内存(称为“内存损坏”)。
2.未释放不再使用的内存(称为“内存泄漏”)
如何避免内存泄漏
每次当调用malloc分配内存时,注意在以后要调用相应的free来释放它。
如果不知道如何调用free与先前的malloc相对应,那么很可能已经造成了内存泄漏!
一种简单的方法就是在可能的时候使用alloca来分配动态内存,以避免上述情况。当离开调用alloca的函数时,它所分配的内存会被自动释放。
显然,这并不是用与那些比创建他们的函数生命期更长的结构,但如果对象的色很难过名期在该函数结束前便已停止,这种简历在堆栈上的动态内存分配是一种开销很小的选择,allocal就很难高效的实现。
如何检测内存泄漏
观察内存泄漏是一个两步骤的过程。
1.首先,使用swap命令观察还有多少可用的交换空间:
swap -s
在一两分钟内键入命令三到四次,看看可用的交换区是否在减少。还可以使用其他一些/usr/bin/*stat工具如netstat、vmstat等。如果发现不断有内存被分配且从不释放,一个可能的解释就是有个进程出现了内存泄漏。
2.第二个步骤就是确定可疑的进程,看看它是不是该为内存泄漏负责。你可能知道那个进程是罪魁祸首,不然可以使用“ps -lu用户名”命令来显示所有进程的大小。同样数次重复这个命令,可以发现任何动态分配内存的进程的大小都在增长。如果一个进程看上去不断的增长而从不缩小,它就又可能出现了内存泄漏。