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

首先STRING是一个类,类的私有成员是char*pSTRING&operator=(constSTRING&s)if(&s==this)regurn*thisif(p)... 首先STRING是一个类,类的私有成员是char *p
STRING & operator =(const STRING &s)
if(&s==this) regurn *this
if(p) delete[]p;
if(s.p==NULL)p=NULL;
else{
p=new char[strlen(s.p)+1]
strcpy(p,s.p);
}
return *this;
}

if(p)是谁的简写?为什么看到if(p)就知道(*this).p的值不是NULL?而且(*this).p一定指向一个位于动态内存的数组?

我是个刚学C++的新手,麻烦讲的通俗些,详细些,谢谢了
展开
 我来答
风若远去何人留
2015-06-08 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20403 获赞数:450142
专业C/C++软件开发

向TA提问 私信TA
展开全部
该操作功能为如果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)来做保护。
匿名用户
2013-04-20
展开全部
if(p != NULL)由于NULL被定义成0,也就是if(p != 0),又因为非零相当于真,因此相当于if(p),不过这是一个不规范的写法,尽管在绝大多数情况下,是正确的。(比如定义NULL为-1)
因为过程是这样
if(p != NULL) delete []p;
每次给p赋值的时候,都是new来的一个指针,new成功时,返回的指针永远不是NULL,new 失败则返回NULL,也不用释放。因此遇到不是NULL的指针,就可以认为指向一个动态分配的内存数组。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
seamaswong
2013-04-20 · TA获得超过1122个赞
知道小有建树答主
回答量:483
采纳率:0%
帮助的人:390万
展开全部
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; //返回自己
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式