的确,如果操作系统实现正确,当程序退出之后,为它所分配的内存的确都会释放掉,但问题是,对于一个进程内存的申请和释放,是程序通过 sbrk,mmap 等系统调用进行的,也就是说, 进程应该对为它分配的内存负责 .
在堆内存上的数据,我们可以定义两类,一类是可达的,一类是不可达的。
可达的就是,我可以通过程序现有的一些指针,获取数据的地址,从而获取数据,比如:
a
=
malloc
(
4
);
我们使用 malloc 申请了四字节的内存,然后函数返回了一个指针给我们,这个指针就指向这四字节内存的开始位置,于是我们把这个指针的值存到了变量
a
里,于是,这四字节的内存就是「可达」的。
而如果是这样呢:
malloc
(
4
)
我们仅仅是申请了 4 字节的内存,可是,我们却没有把这内存的起始地址存在任何一个地方,当 malloc 函数返回的时候,程序就没有办法知道这段内存的起始位置了,既然没办法知道,那么这四字节的内存,就变成了「不可达」的,或者说 unreachable 的,但是它仍然是操作系统为我们分配的内存,