内存泄漏的场景分析和避免方法总结,C语言内存泄漏详解

  • 内容
  • 评论
  • 相关

大家都知道,在堆上分配的内存,如果不再使用了,就应该及时释放,以便后面其他地方可以重用。而在 C 语言中,内存管理器不会自动回收不再使用的内存。如果忘了释放不再使用的内存,这些内存就不能被重用了,这就造成了内存泄漏

内存泄漏几乎是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows 与 Linux 这类系统软件也或多或少存在着内存泄漏。

也许对一般的应用软件来说,这个问题似乎不是那么突出与严重。一两处内存泄漏通常并不致于让程序崩溃,也不会带来逻辑上的错误,而且在进程退出时,系统会自动释放所有与该进程相关的内存(共享内存除外),所以内存泄漏的后果相对来说还是比较温和的。但是,量变会导致质变,一旦内存泄漏过多以致耗尽内存,后续内存分配将会失败,程序就可能因此而崩溃。

在常见情况下,内存泄漏的主要可见症状就是罪魁进程的速度减慢。原因是体积大的进程更有可能被系统换出,让别的进程运行,而且大的进程在换进换出时花费的时间也更多。即使泄漏的内存本身并不被引用,但它仍然可能存在于页面中(内容自然是垃圾),这样就增加了进程的工作页数量,降低了性能。

下面展示了一些导致内存泄漏的常见场景。

1) 指针重新赋值

看下面一段示例代码:

char * p = (char *)malloc(10);
char * np = (char *)malloc(10);

其中,指针变量 p 和 np 分别被分配了 10 个字节的内存,它们各自的内存如图 1 所示。



图 1 p 和 np 赋值前的内存

本文标题:内存泄漏的场景分析和避免方法总结,C语言内存泄漏详解

本文地址:http://www.hosteonscn.com/2797.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注