什么是内存泄漏?它是如何产生的?代码举例讲解

内存泄漏指程序未能释放已经不再使用的内存,导致占用的内存量不断增加,严重时会耗尽可用内存。

内存泄漏的常见原因有:

  1. 忘记释放动态分配的内存:如使用 malloc 分配内存但忘记调用 free 释放。
    示例:
c
void foo() {
    int *p = malloc(sizeof(int));  // allocate memory
    // forgot to call free(p) 
}
  1. 失去对象的最后一个引用:导致对象无法被垃圾回收。
    示例:
python
import weakref

def foo():
    a = [1, 2, 3]
    b = a   # b is a strong reference to a 
a = None   # lose the last reference to a 

# `a` can't be garbage collected here 
# due to the strong reference in `b`
  1. 被循环引用的对象:两个对象互相引用,无法被垃圾回收。
    示例:
python
a = [1, 2, 3]
b = [4, 5, 6]
a.append(b)
b.append(a)

# a and b are circularly referenced
# and will never be GC'd  
  1. 管理资源不正确:如文件打开但未关闭,网络连接打开未关闭等。
    示例:
python 
f = open('file.txt')  
# forgot to call f.close()
  1. 哈希表的 key 失效但未被移除:在哈希表中为 key 分配内存,key 失效后该内存会一直占用。

解决内存泄漏的方法主要有:

  1. 释放不需要的内存,如调用 free() 释放动态分配内存。
  2. 破坏循环引用,使用 weak 类型如 weakRef。
  3. 资源及时关闭,如文件关闭或网络连接关闭。
  4. 定期搜索并清理失效的哈希表 key。
  5. 使用内存管理工具或语言如 RAII 或 smart pointer 等。