内存泄漏指程序未能释放已经不再使用的内存,导致占用的内存量不断增加,严重时会耗尽可用内存。
内存泄漏的常见原因有:
- 忘记释放动态分配的内存:如使用 malloc 分配内存但忘记调用 free 释放。
示例:
c
void foo() {
int *p = malloc(sizeof(int)); // allocate memory
// forgot to call free(p)
}
- 失去对象的最后一个引用:导致对象无法被垃圾回收。
示例:
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`
- 被循环引用的对象:两个对象互相引用,无法被垃圾回收。
示例:
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
- 管理资源不正确:如文件打开但未关闭,网络连接打开未关闭等。
示例:
python
f = open('file.txt')
# forgot to call f.close()
- 哈希表的 key 失效但未被移除:在哈希表中为 key 分配内存,key 失效后该内存会一直占用。
解决内存泄漏的方法主要有:
- 释放不需要的内存,如调用 free() 释放动态分配内存。
- 破坏循环引用,使用 weak 类型如 weakRef。
- 资源及时关闭,如文件关闭或网络连接关闭。
- 定期搜索并清理失效的哈希表 key。
- 使用内存管理工具或语言如 RAII 或 smart pointer 等。