- 浏览: 3047864 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
原文在此:Can you delete a NULL pointer?
没全转过来,只是留个记录。
根据目前的C++草案,Working Draft, Standard for Programming Language C++
它说如果不是空指针就调用析构函数。换句话说delete NULL;什么也不会发生。
不过delete一个指针并不会改变指针的值(不会在delete后将指针设为NULL),所以调用了delete之后最好自己把指针设为空指针,
===================================
Hmm,想起之前读到的一些可怕的代码。像这种:
这样写太容易出错了。习惯直接用!不好么……
而if (flag == true)就更糟糕了……直接if (flag)就完事了嘛。
我大本营被挖出来了么……||||
如果是写if (false == flag)我会不那么怕;主要是这相等性运算符跟赋值运算符太容易混在一起,写if (flag = false)一眼看上去也没什么不自然的,然后就错了。如果要判断等于true时直接写flag,判断等于false时直接写!flag,因为不用写等号所以问题就没那么严重。
再说,flag的名字一般会是isDone之类的,写成if (isdone)读起来很顺口,写成if (isDone == true)以我的习惯总觉得怪怪的……纯粹是个人喜好而已,没别的。
又一个勇于直面NC小测试的同学(拍肩
很简单撒,因为alias的问题。C++不知道你delete一个指针前到底创建了多少个alias,如果它只把你delete的那一个指针置为NULL,其它怎么办?既然不能全管,干脆不管。
在带有exact GC的语言实现里,运行时会跟踪所有指针,保证alias的指针能同步更新。C++里没这玩儿。要注意的是conservative GC一样是不管指针的更新的,所以用conservative GC就没办法移动托管堆上的对象……
没全转过来,只是留个记录。
根据目前的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不知道有没有这种规定……
如果是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回帖还要做一个长篇测试……
关于 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这个东西可以没有
可能把结构体后面的一段内存标记为可用可能归还给系统也可能什么都不做(上次看了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 比较好……
为了效率而省一步操作?
-------------------------------------------
那些可怕的代码似乎不难更改,全局替换……
#define DELETE(x) delete x; x = NULL
或许重新定义 delete operator 比较 C++?
delete 完不置 NULL 比较费解,按照 COC 的原则,怎么都是置 NULL 比较好……
为了效率而省一步操作?
-------------------------------------------
那些可怕的代码似乎不难更改,全局替换……
发表评论
-
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21489(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
struct做参数不能从寄存器传?
2013-08-28 23:33 0test test test struct Foo { i ... -
[入门级] 使用inline函数的陷阱
2011-04-21 22:39 0xxx.hpp xxx.inline.hpp inline ... -
C++的vtable的name mangling
2011-04-21 21:53 0_ZTV 开头 -
C++里用typedef struct...
2010-06-12 14:42 3887今天要写个东西,参照的一段C++代码里看到了诡异的东西,形式类 ... -
C++的虚方法调用的开销
2010-01-10 02:53 0不只是从vftbl找到函数指针那么简单而已。因为C++支持多继 ... -
C++求值顺序
2009-12-12 23:16 0呵呵,有个例子总是形 ... -
__fastcall由callee做栈平衡
2009-10-14 01:51 0#include <iostream> usin ... -
typedef...
2009-06-16 21:22 0原来函数指针能这样用的啊……原来typedef不只可以用来声明 ... -
拿vtable来玩玩
2009-06-04 03:53 0#include <iostream> usin ... -
从1加到N……我败了
2009-05-11 10:06 0有人提到Python比C++优越因为代码短而简洁,并举例说1加 ... -
Boost 1.35.0
2008-06-25 04:45 0Boost C++ Library Version 1.35. ... -
确定性析构在有指针的环境下的麻烦之处
2008-05-16 11:26 2624刚考完大软,心里还在 ... -
typename关键字的使用
2008-05-15 11:31 2907忘了……模板啊忘光了 T T 今天有同学考C++,后来问了我 ... -
又是宏……do..while(0)的用法
2008-05-04 20:24 4667真是的,我用C++还是太少了。这个宏以前明明见过的,但其存在的 ... -
火星了,今天才知道C++0x也通过了lambda表达式/闭包的提案
2008-04-16 19:31 3078如题。我总是后知后觉诶。不过这提案有意思…… 之前我在C#与 ... -
将ANTLR生成的.tokens文件重格式化(C++版)
2008-03-28 02:02 2458相关链接: 将ANTLR生成的.tokens文件重格式化(Ru ... -
奇怪的宏
2007-11-05 22:19 2113我C++确实不怎么样,不过近来不得不再唤醒那远古的记忆……即使 ...
相关推荐
不正确地使用`delete`可能会导致内存泄漏,即已分配的内存无法被再次使用。 `nothrow`版本的`new`和`new[]`: 在某些情况下,程序员可能希望在内存分配失败时不抛出异常,而是返回一个特殊的值(通常是`NULL`)。...
此外,`delete`操作在某些情况下可能会影响性能,因为它涉及到运行时的查找和垃圾收集。因此,如果仅是为了释放内存,通常建议将对象属性设为`null`,而不是使用`delete`。例如: ```actionscript obj.name = null;...
当用户按下Ctrl+Alt+Delete时,Windows会发送一个WM_HOTKEY消息到消息队列。因此,我们需要创建一个窗口类,并在该窗口类的消息映射中捕获这个消息。 1. 创建一个Win32应用程序项目: 在Visual Studio中,创建一个...
每个动作方法对应的视图会显示相应的表单或信息。例如,`Create.cshtml`和`Edit.cshtml`通常包含一个表单,允许用户输入或编辑数据;`Delete.cshtml`可能是一个简单的确认页面。 此外,提到的`elijahmanor-...
1. **谨慎操作**:在执行涉及多个表的DELETE操作时,务必小心,因为这可能会导致大量数据被删除,且无法恢复。 2. **备份数据**:在进行大规模的数据清理之前,确保有最新的数据库备份,以防不测。 3. **事务处理**...
当一个父对象被销毁时,其析构函数会遍历子对象链表,并递归地销毁所有子对象及其后代对象。这意味着只需要销毁最顶层的父对象即可,Qt会处理好所有相关的子对象。 #### 三、示例代码分析 为了更好地理解Qt对象...
每个构造函数都需要初始化指针,即使初始值为NULL,以防后续操作中出现未定义行为。赋值操作符也应该处理指针成员,确保旧内存被正确释放,然后再分配新内存。 typedef可以简化类型名称,但在涉及动态内存分配时...
如果用户没有足够的权限,`delete()`方法会返回`false`。在实际操作前,最好检查文件或目录的权限。 5. **并发考虑** 如果多个线程同时尝试修改同一个文件或目录,可能会出现竞态条件。在多线程环境中,应考虑使用...
【SQL基础操作】这篇练习主要涉及SQL中的基本操作,包括INSERT、UPDATE、DELETE以及与NULL和VIEW相关的知识点。这些操作是数据库管理的核心,用于创建、更新和删除数据。 1. **INSERT语句**:用于向数据库表中插入...
总之,INSERT、UPDATE 和 DELETE 操作是数据库操作的基础,而 NULL 和 VIEW 提供了更高级的功能。理解和熟练掌握这些概念是进行有效数据库管理和开发的关键。在实际应用中,应谨慎处理数据,确保数据的准确性和一致...
而在正常情况下,`delete p`会调用`operator delete(void*)`。 总结来说,自定义`operator new`和`operator delete`提供了对内存管理的灵活性,但同时也要求程序员遵循一定的规则,确保在异常处理时内存能得到正确...
它还会自动调用构造函数来初始化对象。相反,`delete`用于释放由`new`分配的内存,并调用析构函数。在C语言中,我们没有这样的内置机制,但可以通过自定义函数来实现类似的功能。 在C语言中,我们通常使用`malloc`...
在Web开发过程中,经常会遇到使用Ajax发送PUT或DELETE请求时出现的问题。这通常发生在使用RESTful API风格的情况下,即使用HTTP动词如GET(查询)、POST(新增)、PUT(修改)、DELETE(删除)来表示对资源的不同...
= null) { content.append(inputLine); } in.close(); int responseCode = connection.getResponseCode(); ``` 在给定的压缩包中,`8744277_RestfulRequestHelper.java` 文件很可能包含了一个名为`...
- 如果某列允许NULL值,可以在插入时省略该列或直接指定NULL。 - 插入日期时,应使用标准的日期格式(例如`YYYY-MM-DD`),以确保数据正确存储。 #### 二、Select语句 **定义与用途**: - **Select** 语句用于从表...
DELETE FROM sc WHERE score IS NULL ``` 这将清除所有成绩为空的记录。 ### 总结 在进行`DELETE`操作时,务必谨慎,因为它无法回滚,一旦数据被删除,通常就无法恢复。在执行`DELETE`之前,确保备份重要数据,...
在content.txt文件中,可能会包含自定义`new`和`delete`的具体实现代码,以及相关的注释和解释。这些内容可能涉及如何在类作用域或全局作用域中定义这些操作符,如何处理不同类型的对象(如数组),以及如何与`new[]...
在这篇文章中,我们将讨论C++编程语言中的几个重要概念,包括const对象、NULL和nullptr、new和delete操作符、malloc和free函数等。 1.(const对象) 在C++中,const对象是一个不可改变的对象,它的值不能被修改。...
三、注意:当指针p的值为NULL时,多次使用delete p并不会带来麻烦,因为释放空指针的空间实际上不会导致任何操作。所以,将“不用”的指针设置为NULL是一个好的编程习惯。 使用new和delete时,需要注意新与delete的...
本篇文章将重点介绍INSERT、UPDATE和DELETE操作,以及NULL值和VIEW的使用。 首先,我们来看INSERT语句,用于向数据库表中添加新的数据。有两种插入数据的方式: 1. 插入元组:例如,`INSERT INTO Student(Sno, ...