这里介绍指针内存释放的三点注意事项;
一 。指针内存释放,有多少个new,就要有多少个delete。
大家先看下面的程序:
char **PP =new char *[3];
for (int j=0; j<3; j++)
{
PP[j]=new char[10];
}
for (int j=0; j<3; j++)
{
if(PP[j] != NULL)
{
delete [ ]PP[j];
PP[j] = NULL;
}
}
delete [ ]PP;
PP = NULL;
我们先是定义了一个指向三个元素的数组指针,然后给这三个数值指针开辟新的10个空间;后面释放内存,开辟四次,就必须要释放四次;
再看看下面的赋值程序:
char **PP =new char *[3];
for (int j=0; j<3; j++)
{
PP[j]=new char[10];
cout<<"&PP[j]="<<&PP[j]<<endl;
cout<<"PP["<<j<<"]="<<PP[j]<<endl;
cout<<"*PP["<<j<<"]="<<*PP[j]<<endl;
strcpy(PP[j],"ABCD"); ///<这里是把指针PP[i]的指向"ABCD"的首地址,指针PP[i]的地址没有任何改变
//PP[j]="ABCD"; ///<这里是值把指针PP[i]的指针改变为r142的地址,现在改变了PP[i]指针的地址
cout<<"&PP[j]="<<&PP[j]<<endl;
cout<<"PP["<<j<<"]="<<PP[j]<<endl;
cout<<"*PP["<<j<<"]="<<*PP[j]<<endl;
cout<<endl;
}
for (int j=0; j<3; j++)
{
if(PP[j] != NULL)
{
delete [ ]PP[j];
PP[j] = NULL;
}
}
delete [ ]PP;
PP = NULL;
值得注意的是,把strcpy(PP[j],"ABCD")去掉,用PP[j]="ABCD";你会发现程序会报错,只运行到delete [ ]PP[0];就停止了,而用strcpy(PP[j],"ABCD")去掉PP[j]="ABCD"是可以的,这是为什么呢?
原因:1.strcpy(PP[j],"ABCD"); 这里是把指针PP[i]的指向"ABCD"的首地址,指针PP[i]的地址没有任何改变,所有可以正常delete。
2.PP[j]="ABCD"; ///<这里是把指针PP[i]的地址改变为“ABCD”的地址,现在PP[i]指针的地址已经不是char[10]的首地址了,然后delete就删除了“ABCD”的地址。
二 避免野指针的出现
char * sas= new char[3];
//char *q=sas;
*(sas++)='a';
*(sas++)='b';
*(sas)='c';
delete sas;///<有问题,因为现在指针指向第三个位置,只删除了‘c’的内存,‘a'和'b'的都没有删除啊
sas = null;
//delete q;///<OK,q来记录sas刚开始指向的首地址,所有可以
//q=NULL;
问题的原因上面已经给出,a,b的内存就没有删除,造成的内存泄露。
克服办法:
1.方法一,指针回去,就行SS--,回到原点,再delete,
2. 方法二,之前定义一个指针,记录指针的地址,char *MM=SS; 最后delete MM
三 new/delete\new xx[] / delete [] xx 需要配对使用。
char * p= new char[10];
int i=0;
for( i=0; i<10; i++)
{
p[i]='a'; ///<
cout<<"p["<<i<<"]"<<p[i]<<endl;
}
delete[] p;
p=NULL;