`
RednaxelaFX
  • 浏览: 3052931 次
  • 性别: 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 比较好……

为了效率而省一步操作?

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

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

相关推荐

    动态内存分配操作符new和delete

    不正确地使用`delete`可能会导致内存泄漏,即已分配的内存无法被再次使用。 `nothrow`版本的`new`和`new[]`: 在某些情况下,程序员可能希望在内存分配失败时不抛出异常,而是返回一个特殊的值(通常是`NULL`)。...

    Actionscript中delete关键字例子

    此外,`delete`操作在某些情况下可能会影响性能,因为它涉及到运行时的查找和垃圾收集。因此,如果仅是为了释放内存,通常建议将对象属性设为`null`,而不是使用`delete`。例如: ```actionscript obj.name = null;...

    vc禁用Window的Ctrl+Alt+Delete组合键.visual c++

    当用户按下Ctrl+Alt+Delete时,Windows会发送一个WM_HOTKEY消息到消息队列。因此,我们需要创建一个窗口类,并在该窗口类的消息映射中捕获这个消息。 1. 创建一个Win32应用程序项目: 在Visual Studio中,创建一个...

    asp.net mvc add edit delete

    每个动作方法对应的视图会显示相应的表单或信息。例如,`Create.cshtml`和`Edit.cshtml`通常包含一个表单,允许用户输入或编辑数据;`Delete.cshtml`可能是一个简单的确认页面。 此外,提到的`elijahmanor-...

    【SQL】在sql server中 delete时 使用INNER JOIN

    1. **谨慎操作**:在执行涉及多个表的DELETE操作时,务必小心,因为这可能会导致大量数据被删除,且无法恢复。 2. **备份数据**:在进行大规模的数据清理之前,确保有最新的数据库备份,以防不测。 3. **事务处理**...

    QT父子与QT对象delete

    当一个父对象被销毁时,其析构函数会遍历子对象链表,并递归地销毁所有子对象及其后代对象。这意味着只需要销毁最顶层的父对象即可,Qt会处理好所有相关的子对象。 #### 三、示例代码分析 为了更好地理解Qt对象...

    C++内存管理详解,new,delete的合理使用

    每个构造函数都需要初始化指针,即使初始值为NULL,以防后续操作中出现未定义行为。赋值操作符也应该处理指针成员,确保旧内存被正确释放,然后再分配新内存。 typedef可以简化类型名称,但在涉及动态内存分配时...

    delete文件和目录

    如果用户没有足够的权限,`delete()`方法会返回`false`。在实际操作前,最好检查文件或目录的权限。 5. **并发考虑** 如果多个线程同时尝试修改同一个文件或目录,可能会出现竞态条件。在多线程环境中,应考虑使用...

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

    【SQL基础操作】这篇练习主要涉及SQL中的基本操作,包括INSERT、UPDATE、DELETE以及与NULL和VIEW相关的知识点。这些操作是数据库管理的核心,用于创建、更新和删除数据。 1. **INSERT语句**:用于向数据库表中插入...

    INSERT / UPDATE / DELETE / NULL / VIEW

    总之,INSERT、UPDATE 和 DELETE 操作是数据库操作的基础,而 NULL 和 VIEW 提供了更高级的功能。理解和熟练掌握这些概念是进行有效数据库管理和开发的关键。在实际应用中,应谨慎处理数据,确保数据的准确性和一致...

    拨开自定义operator new与operator delete的迷雾.docx

    而在正常情况下,`delete p`会调用`operator delete(void*)`。 总结来说,自定义`operator new`和`operator delete`提供了对内存管理的灵活性,但同时也要求程序员遵循一定的规则,确保在异常处理时内存能得到正确...

    C语言也能面向对象(三)——通用的new和delete

    它还会自动调用构造函数来初始化对象。相反,`delete`用于释放由`new`分配的内存,并调用析构函数。在C语言中,我们没有这样的内置机制,但可以通过自定义函数来实现类似的功能。 在C语言中,我们通常使用`malloc`...

    Ajax发送PUT-DELETE请求时出现错误的原因及解决方案.docx

    在Web开发过程中,经常会遇到使用Ajax发送PUT或DELETE请求时出现的问题。这通常发生在使用RESTful API风格的情况下,即使用HTTP动词如GET(查询)、POST(新增)、PUT(修改)、DELETE(删除)来表示对资源的不同...

    java http 发送 put delete post get请求

    = null) { content.append(inputLine); } in.close(); int responseCode = connection.getResponseCode(); ``` 在给定的压缩包中,`8744277_RestfulRequestHelper.java` 文件很可能包含了一个名为`...

    Insert,Select,Update和Delete。

    - 如果某列允许NULL值,可以在插入时省略该列或直接指定NULL。 - 插入日期时,应使用标准的日期格式(例如`YYYY-MM-DD`),以确保数据正确存储。 #### 二、Select语句 **定义与用途**: - **Select** 语句用于从表...

    Delete语句基于单表删除数据.pdf

    DELETE FROM sc WHERE score IS NULL ``` 这将清除所有成绩为空的记录。 ### 总结 在进行`DELETE`操作时,务必谨慎,因为它无法回滚,一旦数据被删除,通常就无法恢复。在执行`DELETE`之前,确保备份重要数据,...

    自定义数据new/delete源码

    在content.txt文件中,可能会包含自定义`new`和`delete`的具体实现代码,以及相关的注释和解释。这些内容可能涉及如何在类作用域或全局作用域中定义这些操作符,如何处理不同类型的对象(如数组),以及如何与`new[]...

    2.const对象-NULL和nullptr-C++中创建对象数组.docx

    在这篇文章中,我们将讨论C++编程语言中的几个重要概念,包括const对象、NULL和nullptr、new和delete操作符、malloc和free函数等。 1.(const对象) 在C++中,const对象是一个不可改变的对象,它的值不能被修改。...

    C++ 使用new与delete需注意的原则

    三、注意:当指针p的值为NULL时,多次使用delete p并不会带来麻烦,因为释放空指针的空间实际上不会导致任何操作。所以,将“不用”的指针设置为NULL是一个好的编程习惯。 使用new和delete时,需要注意新与delete的...

    SQL Server——从入门到放弃(6)–INSERT / UPDATE / DELETE / NULL / VIEW 练习

    本篇文章将重点介绍INSERT、UPDATE和DELETE操作,以及NULL值和VIEW的使用。 首先,我们来看INSERT语句,用于向数据库表中添加新的数据。有两种插入数据的方式: 1. 插入元组:例如,`INSERT INTO Student(Sno, ...

Global site tag (gtag.js) - Google Analytics