#include <iostream>
using namespace std;
//使用pTemp是为了看p初始开辟的空间是否被删除。
//但是事实上没有,所有如果这样开辟的空间大,p重新调用多次new就会出现内存泄露的问题!
//delete时不要两次调用!并且最好在delele时候if判断下,并且delete后设置为NULL
//并且这样也方便在编程的时候及时找到错误,因为p=NULL后再调用p就会出错,但是如果只delete[] p,就不会出错,
//但是使用一个已经delete的指针非常危险!
int main(int argc, char* argv[])
{
int* p=new int[5];//p 开辟5个空间
int* pTemp=p;//保存开始开辟的内存地址
for (int i=0;i<5;i++)
{
p[i]=10;//在原始空间赋值
}
p=new int[5];//再用p另外开辟5个空间
for (i=0;i<5;i++)
{
p[i]=20;//重新赋值
}
delete[] p;
// if (p!=NULL)
// {
// delete[] p;
// p=NULL;
// }
for (i=0;i<5;i++)
{
cout<<p[i]<<" ";//已删除,但是还能用,只是,使用已删除的指针非常危险!
//如果delete后p=NULL,则会提示错误
}
cout<<endl;
for (i=0;i<5;i++)
{
cout<<pTemp[i]<<" ";//原来的空间还有值!!没有删除,如果开始没设置pTemp(而事实上往往如此),
//那么p开始开辟的那块内存就无法删除了!!内存泄露
}
// delete[] p;//指针2次删除
// delete[] p;//指针2次删除 //程序内存错误,直接崩溃
// if (p!=NULL)
// {
// delete[] p;
// }
// if (p!=NULL)
// {
// delete[] p; //同样的结果,程序内存错误,直接崩溃
// }
if (p!=NULL) //比较好的写法
{
delete[] p;
p=NULL;
}
if (p!=NULL)
{
delete[] p;
p=NULL;
}
return 0;
}