用malloc申请的内存,没有释放,为什么程序也不会出错?
最近有好几位同学提出了这个问题。
讲到C语言指针的时候,我们都会反复强调,malloc申请的堆内存,用完后一定要用free释放掉,否则光申请不释放,内存就会变的越来越少,这种现象就叫做内存泄漏。
泄漏到一定程度,没有内存可用,程序可能就会奔溃。
很多同学在写代码的时候,经常忘记释放内存,比如这段代码:
#includevoid 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字样,所以,同样的一块堆内存,只能释放一次。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !