今天在实现平衡二叉树的一系列操作的时候,发现了一个以前不经常注意的地方,记录一下;
每个程序在执行时都会占用一块可用的内存空间(malloc、new),用于存放动态分配的对象,此内存空间称为自由存储区或堆。
在使用完这块内存之后,就需要我们自己释放这块内存,否则程序就会存在内存泄漏的问题。
这里要注意野指针、僵尸对象的概念:
野指针:指针所指向的内存已经被释放掉,而指针没有被置为NULL,则会变成野指针
1、free、delet 释放仅仅是指针指向的内存(堆空间),让这块内存可以被系统重新分配,而不是销毁指针对象,指针对象是个变量,存在自己的生命周期,随程序的结束而被销毁;
2、另外,free、delet并不会将指针对象置为NULL,所以在释放空间之后,一定要手动置为NULL,防止后面程序以为他是合法指针,再次进行解引用操作,造成错误;
僵尸对象:指已经被释放的空间对象
1、malloc像系统在堆空间申请一块闲置的空间,作为程序需要数据的存放,此时这块空间受保护,不会被其它程序申请
2、free告诉系统不再需要这块空间,可以释放掉,允许系统将它分配给其它程序使用
3、free之后,这块空间(指针指向地址)的数据还是存在的,当分配给其它对象的时候,才会被修改;
使用野指针访问僵尸对象:
1、free指针之后,仅仅是告诉系统回收这块空间,但是空间内的数据以及指针的值(地址)都不会发生改变;
2、因为指针的值和空间数据都还在,所以是可以通过解引用野指针来访问僵尸对象的,但是最好不要这么做,因为如果这块空间被重新分配了重要数据,可能会造成严重的问题,free之后必须手动将指针置为NULL;
3、从下面可以看到,指针已经被free掉了,但是还是可以通过这个指针访问到原来的空间,所以每次释放指针以后,一定要置为NULL,这样在解引用的时候就不会 误操作到野指针
if( p != NULL )