在C++中 内存的动态使用(包含占用和释放)
#include <iostream>
using namespace std;
int main() {
int * p = new int(4);//定义一个整数型指针 使用函数new 分配一块整形内存空间 并且赋初始值 4
cout<<p<<endl;//输出 指针p里面的数据 是一个地址 类似于0x9f17008
cout<<*p<<endl;//输出指针P指向地址空间里面的数据 就是 初始值 :4
cout<<"*********************"<<endl;
*p =7;
cout<<p<<endl;
cout<<*p<<endl;
cout<<"**************"<<endl;
delete p;
cout<<"执行了指针p的内存空间释放"<<endl;
cout<<p<<endl;
cout<<"@@@@@@@@@@@@"<<endl;
p =NULL;
cout<<p<<endl;
cout<<"$$$$$$$$$$$$$$$"<<endl;
return 0;
}
输出结果
0x885b008
4
*********************
0x885b008
7
**************
执行了指针p的内存空间释放
0x885b008
@@@@@@@@@@@@
0
$$$$$$$$$$$$$$$
/××××××××××××××××××××××××/
以上程序的输出结果,说明我们在使用delete清除占用指针p的内存空间,p里面的数据并没有改变。
所以为了程序的严谨需要增加p =NULL;
[解决办法]
#define DEL(a) {delete a; a = NULL;}
[解决办法]
#define DEL(a) {delete a; a = NULL;}
记住检测a 是否空指针。
delete a;
可能是野指针,无从检测野指针。也无从检测是否已经释放。
delete a; a = NULL;
可以检测是否空指针,而且不会是野指针。
if(a==NULL)....
else {dosomting();}
有了这么点改进,所以还勉强算一个好的方法。
但是也不是一劳永逸的。
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George