内存泄漏有什么影响

描述

用malloc申请的内存,没有释放,为什么程序也不会出错?

最近有好几位同学提出了这个问题。

讲到C语言指针的时候,我们都会反复强调,malloc申请的堆内存,用完后一定要用free释放掉,否则光申请不释放,内存就会变的越来越少,这种现象就叫做内存泄漏。

泄漏到一定程度,没有内存可用,程序可能就会奔溃。

很多同学在写代码的时候,经常忘记释放内存,比如这段代码:

 

#include 


void test()
{
    chat *s = (char *)malloc(sizeof(char) * 1024 * 1024);
}


int main()
{
    test();
    
    return 0;
}
 

 

申请了1M堆内存,在程序的任何地方都没有释放。

运行程序后,一切正常,而且即使运行了很多遍,系统也没有问题。

要解释这个问题,就不得不提操作系统的内存管理。

不管是在 Linux 还是 Windows 下写代码,我们用的内存都是虚拟内存。

以 32 位 Linux 为例,每个进程启动的时候,系统都会给他分配4个G的虚拟内存空间,分为用户态和内核态,用户态又分成了堆、栈、数据段、代码段等等。

内存泄漏

由于不同的进程使用的虚拟地址空间不同,所以即使程序出现了段错误,也就是进程本身异常退出,并不会影响其他程序的运行。

程序里面用malloc申请的就是堆空间这一段,如果程序一直在运行不会结束,并且一直在申请没有释放,那过一段时间后程序确实会奔溃。

但是我们学习的时候,更多的是一些测试程序,运行一下程序就结束。进程一旦结束,系统就会回收这段虚拟内存空间,对整个系统或者其他程序也不会产生什么影响。

平时写一些测试程序,还是应该养成释放的习惯,放在大型项目中,内存泄漏既有危害又难排查。

最后,给大家留一个问题,申请的堆内存,需要用free来释放,那同一块内存用free释放两次有没有问题?

这个问题在学习的时候也是经常遇到,如果你在Linux下做开发,这个现象就是释放两次出现的:

内存泄漏

如果往上翻的话,还能看到double free字样,所以,同样的一块堆内存,只能释放一次。


 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分