当面试总是被问到内存泄露的问题,现在就对目前所见到过内存泄露类型做一个总结。
1.malloc包
在C语言里面使用malloc包这样的显示分配器时,应调用malloc和free来分配和释放对堆块,也就是我们的内存空间。当我们忘记释放已分配的块是一种常见的编程错误。
void garbage(){
{
int *p=(int *)malloc(1500);
return;
}
因为程序不需要p,所以在garbage返回前应该释放p。不幸的是,我们经常忘记释放这个块。它在程序的生命周期里面都保持为已分配状态,毫无必要地占用着本来可以用来满足后面分配请求的堆空间。当然这个堆空间是指我们的虚拟内存空间,而不是物理存储器空间。
2.多线程
下面来看一个基于线程的并发服务器例子,我们直接来看它的线程例程:
void *thread(void *vargp){
int connfd=*((int*) vargp); //文件连接描述符
Pthread_detach(pthread_self);//分离线程
Free(vargp);
echo(connfd);
Close(connfd);
return NULL;
}
这是一个简单的回射程序,我们在线程例程例程里面完成了所有的调用。我们知道,在同一个时间点上,线程是可结合和可分离的。如果我们不显式地回收线程,我们就必须分离每个线程,使得在它终止时它的存储器资源能够被回收。更进一步,我们必须小心释放主线程分配的存储器块(Free(vargp))。