4.3.4 不要使用或释放已经释放的内存块
使用或释放已经释放了的内存块会出现意想不到的错误。在使用delete释放内存时,delete后的指针并不要求一定是用new命令进行赋值的那个指针,编译器关心的是内存块的地址,而不是用哪个指针来释放,见代码4.6。
代码4.6 使用或释放已经释放的内存OperatorDelete
<————————————-文件名:example406.cpp——————————————-> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 int*pN1=new int(8);//申请一个int型大小的动态内存,初始化为8 06 int*pN2=pN1;//指针间的赋值 07 delete pN2;//释放掉pN2指向的动态内存 08 cout<<*pN1<<endl; 09 delete pN1;//释放掉pN1指向的动态内存 10 return 0; 11 }
【代码解析】代码第7行,“delete pN2;”语句实际上已经释放了语句“intpN1=new int(8);”申请的内存,所以,代码第8行“cout<<pN1<<endl;”对*pN1的访问已经没有了意义,因为pN1指向的内存已经被释放,所以程序输出值并不为8,而是一个随机值,执行“delete pN1;”相当于对已经释放的内存再次释放,此时,系统报错,出现不可预料的错误。输出结果如图4.5所示。
图 4.5 使用或释放已经释放的内存带来的问题
注意
释放null指针(即空指针)是没有问题的。