当前位置: 华文星空 > 知识

既然每个程序占用的内存都是操作系统管理的,为什么内存泄漏还是个问题?

2020-06-08知识

的确,如果操作系统实现正确,当程序退出之后,为它所分配的内存的确都会释放掉,但问题是,对于一个进程内存的申请和释放,是程序通过 sbrk,mmap 等系统调用进行的,也就是说, 进程应该对为它分配的内存负责 .

在堆内存上的数据,我们可以定义两类,一类是可达的,一类是不可达的。

可达的就是,我可以通过程序现有的一些指针,获取数据的地址,从而获取数据,比如:

a = malloc ( 4 );

我们使用 malloc 申请了四字节的内存,然后函数返回了一个指针给我们,这个指针就指向这四字节内存的开始位置,于是我们把这个指针的值存到了变量 a 里,于是,这四字节的内存就是「可达」的。

而如果是这样呢:

malloc ( 4 )

我们仅仅是申请了 4 字节的内存,可是,我们却没有把这内存的起始地址存在任何一个地方,当 malloc 函数返回的时候,程序就没有办法知道这段内存的起始位置了,既然没办法知道,那么这四字节的内存,就变成了「不可达」的,或者说 unreachable 的,但是它仍然是操作系统为我们分配的内存,