`
RednaxelaFX
  • 浏览: 3022731 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

delete NULL会怎样?

    博客分类:
  • C++
阅读更多
原文在此:Can you delete a NULL pointer?
没全转过来,只是留个记录。

根据目前的C++草案,Working Draft, Standard for Programming Language C++
Working Draft, Standard for Programming Language C++ 写道
5.3.5 (6): If the value of the operand of the delete-expression is not a null pointer value, the delete-expression will invoke the destructor (if any) for the object or the elements of the array being deleted. In the case of an array, the elements will be destroyed in order of decreasing address (that is, in reverse order of the completion of their constructor; see 12.6.2).

它说如果不是空指针就调用析构函数。换句话说delete NULL;什么也不会发生。

不过delete一个指针并不会改变指针的值(不会在delete后将指针设为NULL),所以调用了delete之后最好自己把指针设为空指针,
delete ptr;
ptr = NULL;


===================================

Hmm,想起之前读到的一些可怕的代码。像这种:
if (flag == false) {
    // ...
}

这样写太容易出错了。习惯直接用!不好么……
if (!flag) {
    // ...
}

而if (flag == true)就更糟糕了……直接if (flag)就完事了嘛。
分享到:
评论
6 楼 RednaxelaFX 2009-12-01  
OwnWaterloo 写道
呃……   你的老家在这里?

我大本营被挖出来了么……||||

OwnWaterloo 写道
关于 if (flag==true) if (flag==false)
如果是C++、且flag的类型为bool,也是可以的。
语言要求bool的值只能为true,或者false。

C99中的bool不知道有没有这种规定……

如果是写if (false == flag)我会不那么怕;主要是这相等性运算符跟赋值运算符太容易混在一起,写if (flag = false)一眼看上去也没什么不自然的,然后就错了。如果要判断等于true时直接写flag,判断等于false时直接写!flag,因为不用写等号所以问题就没那么严重。
再说,flag的名字一般会是isDone之类的,写成if (isdone)读起来很顺口,写成if (isDone == true)以我的习惯总觉得怪怪的……纯粹是个人喜好而已,没别的。

OwnWaterloo 写道
javaeye回帖还要做一个长篇测试……

又一个勇于直面NC小测试的同学(拍肩
5 楼 OwnWaterloo 2009-12-01  
呃……   你的老家在这里?


关于 if (flag==true) if (flag==false)
如果是C++、且flag的类型为bool,也是可以的。
语言要求bool的值只能为true,或者false。

C99中的bool不知道有没有这种规定……

javaeye回帖还要做一个长篇测试……

4 楼 RednaxelaFX 2009-04-25  
一个重要的细节是,delete是C++才有的运算符,而free()是C的标准库里的函数;它们之间并没有任何必然的关联。delete运算符的定义保证了delete NULL等价于no-op,而free()也规定了"If memblock is NULL, the pointer is ignored and free immediately returns"。乱delete和乱free()都可能会很糟糕,不过针对NULL这个特例,大可放心……
3 楼 量产型人型自走炮 2009-04-25  
好像C里面乱free一个地址..行为是未定义的
可能把结构体后面的一段内存标记为可用可能归还给系统也可能什么都不做(上次看了MSVC的实现是单独搞了一张pdesc链表放内存信息gcc听说是结构直接丢在可用内存前N个字节)
另外关于这个==的写法 古老的the c programming language就说过要少用==NULL...其实我一直就觉得true false null这个东西可以没有
2 楼 RednaxelaFX 2009-04-22  
night_stalker 写道
delete 完不置 NULL 比较费解,按照 COC 的原则,怎么都是置 NULL 比较好……为了效率而省一步操作?

很简单撒,因为alias的问题。C++不知道你delete一个指针前到底创建了多少个alias,如果它只把你delete的那一个指针置为NULL,其它怎么办?既然不能全管,干脆不管。
byte* p = GetPointerFromSomewhere();
byte* q = p; // pointer aliasing
delete q;

在带有exact GC的语言实现里,运行时会跟踪所有指针,保证alias的指针能同步更新。C++里没这玩儿。要注意的是conservative GC一样是不管指针的更新的,所以用conservative GC就没办法移动托管堆上的对象……
1 楼 night_stalker 2009-04-22  
不是可以写个宏么?
#define DELETE(x) delete x; x = NULL

或许重新定义 delete operator 比较 C++?

delete 完不置 NULL 比较费解,按照 COC 的原则,怎么都是置 NULL 比较好……

为了效率而省一步操作?

-------------------------------------------

那些可怕的代码似乎不难更改,全局替换……

相关推荐

    Actionscript中delete关键字例子

    NULL 博文链接:https://fuckdkjlfsaene.iteye.com/blog/962949

    北大青鸟第二单元项目

    PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConn(); pstmt = conn.prepareStatement(sql); if(args!=null&&args.length>0){ for(int i = 0;i;i++){ pstmt....

    【数据库作业9】SQL练习6 – INSERT / UPDATE / DELETE / NULL / VIEW

    CRUD —— 增删改查(create、retrieve、update、delete) 同样是增改查,需要区分的是:create/ alter/ drop是对于数据库,表的操作,insert/ update/ delete是对数据的操作。 插入数据——INSERT INSERT INTO [([,...

    INSERT / UPDATE / DELETE / NULL / VIEW

    CRUD —— 增删改查(Create、Retrieve、Update、Delete) CREATE / ALTER / DROP——对于数据库,表的操作 INSERT / UPDATE / DELETE —— 对数据的操作 1.插入数据——INSERT 包括: 插入元组 INSERT INTO [([,......

    在ListView上滑动显示Delete按钮

    NULL 博文链接:https://gundumw100.iteye.com/blog/1935178

    SQL练习6 – INSERT / UPDATE / DELETE / NULL / VIEW

    但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。 【例3.69】将一个新学生元组(学号:20

    课程设计—仓库设备管理

    Ename char(20) not null, Emade char(20) not null , Edate datetime ) create table Instorage ( Eno char (4) not null , Indate datetime not null , Usno char (4) not null ) create table Outstorage...

    xhrhttprequest部分浏览器中不支持put/delete

    NULL 博文链接:https://snandy.iteye.com/blog/1483186

    输入输出流学生信息管理

    Delete 基本信息删除=null; JMenuBar bar;//菜单条 JMenu fileMenu;//菜单 JMenuItem 录入,修改,查询,删除;//下拉菜单内容 Container con=null;//通用抽象容器包 Hashtable 基本信息=null; File file=null...

    【数据库MySQL】数据库网上书店管理系统.pdf

    CREATE TABLE BOOK( BOOKID VARCHAR(50) PRIMARY KEY NOT NULL, BOOKID VARCHAR(50) PRIMARY KEY NOT NULL, WRITER VARCHAR(50) NOT NULL, PRESS VARCHAR(50) NOT NULL, PUBTIME DATETIME NOT NULL, PUBNUM INT NOT...

    【2019-2020春学期】数据库作业9:SQL练习6 – INSERT / UPDATE / DELETE / NULL / VIEW

    1、在定义该属性的时候若说明NOT NULL时,不能取空值,否则会报错。 2、INTO语句中没有说明那些属性列,那在VALUES中要都提及,并且要按照定义的属性次序相同。若没有属性所对应的值,则用NULL。 3、字符串中的内容...

    【3.23数据库作业9】SQL练习6 – INSERT / UPDATE / DELETE / NULL / VIEW

    删除数据(DELETE) 3.6空值的处理 空值的产生 空值的判断 空值的约束条件 3.7视图 定义视图 查询视图 更新视图 视图的作用 ok 我们开始 3.5 数据更新 两种数据插入方式 插入元组 插入子查询结果 -可以一次插入多个...

    实例理解SQL中truncate和delete的区别

    本文以一个简单实例为大家介绍了SQL中truncate和delete的区别,帮助大家理解,具体内容如下 ---创建表Table1 IF OBJECT_ID('Table1','U') IS NOT NULL DROP TABLE Table1 GO CREATE TABLE Table1 (ID INT NOT NULL,...

    spring-boot-delete-http-method

    使用与表示模型的对象(在方法参数中找到)相关联的HTTP DELETE 方法,属性都是 NULL。 为什么要尝试将数据放入请求正文中? 我目前正在做一个项目,要求在正文中,标识符(除了资源的信息已被压制)。 该模型允许...

    C 语言编程常见问题解答.chm

    C 语言编程常见问题解答 【作者】[美]Paul S.R. Chisholm 译:张芳妮 吕 波 【出版社】清华大学出版社 C语言编程常见问题解答(目录) 第l章 C语言 ... 1.... 1.... 1.... 1.... 1.... 1.... 1. 7 怎样才能知道循环... 17.6 怎样才能只...

    create delete tablespace user

    NULL 博文链接:https://j2ee2009.iteye.com/blog/1005083

Global site tag (gtag.js) - Google Analytics