在C++中,能不能delete空指针?

BlueprintIrene 2004-07-06 11:53:49
有如下程序:
char *p = NULL;
delete p;
请问以上程序运行会有问题吗?
...全文
5077 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
标准C++规定,delete空指针是完全合法的,不会引发任何问题。
jumpandfly 2004-07-09
  • 打赏
  • 举报
回复
delete p; p = 0;
第二句重要了,不然p会成野指针,乱指一气,因为delete p 只是释放p先前所指的内存,但释放以后,由于没有给p赋空,那么它还可能乱指
唉,c++忘得差不多了,就记得这一点了,还不知道记错没有:)
---------------------------------------------------------------------
太对了,不过既使是在好多大师的书中,也建议先判断是不是空指针,然后再delete


ljh518 2004-07-08
  • 打赏
  • 举报
回复
如果指针操作数被设置为0,则C++会保证delete 表达式不会调用操作符delete();
在delete指针之前,也没有必要测试其是否为0,实际上在多数实现下如果增加了指针的显式测试那么该测试实际上会被执行两次。

可以结题啦
alexwhu 2004-07-07
  • 打赏
  • 举报
回复
char *p = new char;
delete p;
delete p; // 不能删除两次

最好的风格是:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
因为这段代码在一个函数中,避免函数被调用两次而引起问题

指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
×××××××××××××××××××××
学了很多东西,其实delete后再滞空,意思是防止这个指针再次北delete
bravemanman 2004-07-07
  • 打赏
  • 举报
回复
delete p; p = 0;
第二句重要了,不然p会成野指针,乱指一气,因为delete p 只是释放p先前所指的内存,但释放以后,由于没有给p赋空,那么它还可能乱指
唉,c++忘得差不多了,就记得这一点了,还不知道记错没有:)
xmashuang 2004-07-07
  • 打赏
  • 举报
回复
按照标准的规定是可以的,但是各个编译器实现上各有不同,不建议这样使用,还是严格实行分配--〉使用--〉释放的过程比较好。
bjskyhorse 2004-07-07
  • 打赏
  • 举报
回复
有同志认为删除后把指针置空多余.其实看看<<高质量C++编程>>的说法:
7.7 杜绝“野指针”
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
hwman 2004-07-07
  • 打赏
  • 举报
回复
没事就 delete 玩,多做几次有益无害
QunKangLi 2004-07-07
  • 打赏
  • 举报
回复
C++标准明文规定,那是合法的!
menubutton 2004-07-07
  • 打赏
  • 举报
回复
说的都没错,不管判断与否,但申请了内存空间,用完时就必须要释放是重要的,也是好的习惯!
antijpn 2004-07-07
  • 打赏
  • 举报
回复
delete就是了,没关系,不会有问题的,C++里面自己检查是不是空指针,如果不是空,那么就delete,如果是空,那么就不进行delete

不过delete最大的问题是不会自动把指针设置为NULL,记不得是在什么地方看到的,说是要重载delete操作符解决问题(谁还记得在哪本书上出现过这个意思啊?)
baojian88888 2004-07-07
  • 打赏
  • 举报
回复
4. delete pMyClass;
pMyClass = 0;
这样写也可以,加上一个判断也许可以提高少许的效率
baojian88888 2004-07-07
  • 打赏
  • 举报
回复
1. delete NULL 是没有问题的

2. char *p = new char;
delete p;
delete p; // 不能删除两次

3. 最好的风格是:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
因为这段代码在一个函数中,避免函数被调用两次而引起问题
hszr99 2004-07-07
  • 打赏
  • 举报
回复
ok
郑再鹏 2004-07-07
  • 打赏
  • 举报
回复
if (NULL != ptr)
{
delete ptr;
ptr = NULL;
}
最安全。
Mephisto_76 2004-07-07
  • 打赏
  • 举报
回复
我一般的用
if(p)
{
delete p;
p = 0;
}

但是不判断也是可以的。
sunjx119 2004-07-07
  • 打赏
  • 举报
回复
可以的
也是有意义的!
对程序的通用化很有好处
就是说你new了个指针最后总得释放吧
一般大家还要判断一下到底这个指针是否有内容,如果没有就不用释放了;
可是如果我delete 0是没问题的,那么不管这个指针到底怎么样我都可以统统以一种模式处理了,就是:new -> ... ->delete,方便!高效!
JM0624 2004-07-07
  • 打赏
  • 举报
回复
绝对没有问题!
不过好像没有什么实在意义!
Jinhao 2004-07-06
  • 打赏
  • 举报
回复
delete 空指针是一个很有用的东东
CrazyFormat 2004-07-06
  • 打赏
  • 举报
回复
同意!
加载更多回复(21)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧