C++中,if(p) delete[]p是什么意思?

2025-04-09 08:49:45
推荐回答(3个)
回答1:

该操作功能为如果p非空,则释放p指向的内存。
delete 是C++中的关键字,其功能为释放内存,与之对应的是new关键字。
new关键字可以申请一个单位空间,如
int * p = new int;
是申请一个大小为int型所占空间大小的内存,并把首地址赋值给指针p。
当使用后要释放时,需要调用
delete p;

new关键字还可以申请一组空间,如
int *p = new int [10];
申请一组10个int型的空间,并赋值给指针p。
这种情况下要释放时需要调用
delete [] p;
这种就是本题中所描述的情况。

至于if(p)这种写法是从C中继承来的。C中使用的分配空间函数为malloc,释放空间函数为free.
当调用free且参数为空指针(NULL)时,程序会崩溃,所以在释放的时候一般用
if(p)free(p);来做保护。即只有p非空时才释放。
而C++的delete关键字对此已经做了优化,当参数p为NULL时将不会报错,同时也不会做任何操作。所以在这里的if(p)实际上已经没有必要。只不过在使用C的free函数习惯后,或者不了解delete的新特性的编程人员,还是会加上if(p)来做保护。

回答2:

if(p != NULL)由于NULL被定义成0,也就是if(p != 0),又因为非零相当于真,因此相当于if(p),不过这是一个不规范的写法,尽管在绝大多数情况下,是正确的。(比如定义NULL为-1)
因为过程是这样
if(p != NULL) delete []p;
每次给p赋值的时候,都是new来的一个指针,new成功时,返回的指针永远不是NULL,new 失败则返回NULL,也不用释放。因此遇到不是NULL的指针,就可以认为指向一个动态分配的内存数组。

回答3:

if(p)是在取p的值进行判断,相当于 if(p!=0),对于指针来说,p==NULL 与 p==0 效果基本相同, 因为NULL是一个空指针,而大多数编译器规定,内存为0的地方不能写操作,所以p==0的效果与p==NULL差不多

--为什么看到if(p)就知道(*this).p的值不是NULL?

并不是这么理解的,STRING & operator =(const STRING &s)是一个赋值操作符重载,就是把s赋给当前的STRING对象,先看一下函数的逻辑
STRING & operator =(const STRING &s)
if(&s==this) regurn *this //如果是将自己赋值给自己,直接返回自己
if(p) delete[]p; //如果当前自己不是空的,先把自己删除,防止内存泄漏
if(s.p==NULL)p=NULL; //如果传进来的string是空的,把自己也变空
else{ //else中,分配内存空间,把目标拷贝一份
p=new char[strlen(s.p)+1]
strcpy(p,s.p);
}
return *this; //返回自己
}