
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++的新手,麻烦讲的通俗些,详细些,谢谢了 展开
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++的新手,麻烦讲的通俗些,详细些,谢谢了 展开
展开全部
该操作功能为如果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)来做保护。
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的指针,就可以认为指向一个动态分配的内存数组。
因为过程是这样
if(p != NULL) delete []p;
每次给p赋值的时候,都是new来的一个指针,new成功时,返回的指针永远不是NULL,new 失败则返回NULL,也不用释放。因此遇到不是NULL的指针,就可以认为指向一个动态分配的内存数组。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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; //返回自己
}
--为什么看到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; //返回自己
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询