工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1624|回复: 7

Delete NULL error?

[复制链接]
发表于 2005-12-1 19:56 | 显示全部楼层 |阅读模式
int main()
{
        int *p=NULL;
        delete p;
        return 1;
}

猜猜这句会不会出错
说说理由。

今天看C++ Primer一发现
头像被屏蔽
发表于 2005-12-1 21:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2005-12-1 21:26 | 显示全部楼层
会不会导致内存有问题啊?因为这是个0地址。看delete函数怎么运行的了
回复

使用道具 举报

 楼主| 发表于 2005-12-1 21:38 | 显示全部楼层
delete 这个函数已近自带检测是否null
所以如果有个指针p
这样写是多余的if(!p)delete p;

阿阿,以前写了很多多余代码
以后还应该注意把p=NULL

就好像:
int *p=new int;
doSomething(p);
delete p;
//delete p;//这句不能有,不能删除两次
p=NULL;//这句保证以后不会删错

[ Last edited by adisonlee on 2005-12-1 at 21:40 ]
回复

使用道具 举报

发表于 2005-12-1 22:35 | 显示全部楼层
如果p等于NULL,则delete p不作任何事情

delete之后,立即将指针设置为NULL,防止产生“野指针”。
回复

使用道具 举报

发表于 2005-12-1 22:54 | 显示全部楼层
new/delete是C++的运算符,不是函数.

delete一个指针多少次都可以通过编译,但是正确做法是这样的

delete p;
p=NULL;

设p=NULL不是为了防止删除错,而是怕给一个指向的内存已经给delete的指针赋值.
回复

使用道具 举报

 楼主| 发表于 2005-12-5 00:01 | 显示全部楼层
Originally posted by powerwind at 2005-12-1 10:54 PM:
new/delete是C++的运算符,不是函数.

delete一个指针多少次都可以通过编译,但是正确做法是这样的

delete p;
p=NULL;

设p=NULL不是为了防止删除错,而是怕给一个指向的内存已经给delete的指针赋值.


delete也算对于编译器来说也是个函数吧,因为在编一器眼中就好像这样调用delete(p)
只是个比较特别的函数

就好像调用\"+\"号函数,都需要自己重载
例如class a,b;
a=a+b;其中+号都需要我自己写函数。

甚至new 和delete 也可以重载(C++Primer,P632)

关于:\"设p=NULL不是为了防止删除错,而是怕给一个指向的内存已经给delete的指针赋值\"
这个不太明白你说什么哦(什么是已近给delete的指针赋值),不过具体看看C++ primer一些看法,我也只是参考他的发言,阿阿,具体不讨论太多。
关于delete的一些关于delete NULL操作页数:P340
回复

使用道具 举报

发表于 2005-12-5 00:13 | 显示全部楼层
设p=NULL不是为了防止删除错,而是怕给一个指向的内存已经给delete的指针赋值.
我是说得不清。
应该说,如果执行了delete p,然后再对P进行操作,比如再delete或赋值,那个时候它的内存已经另有分配了。可能会崩溃
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-6-6 22:26

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表