- 浏览: 3022731 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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 21400(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 3852今天要写个东西,参照的一段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 2580刚考完大软,心里还在 ... -
typename关键字的使用
2008-05-15 11:31 2872忘了……模板啊忘光了 T T 今天有同学考C++,后来问了我 ... -
又是宏……do..while(0)的用法
2008-05-04 20:24 4640真是的,我用C++还是太少了。这个宏以前明明见过的,但其存在的 ... -
火星了,今天才知道C++0x也通过了lambda表达式/闭包的提案
2008-04-16 19:31 3032如题。我总是后知后觉诶。不过这提案有意思…… 之前我在C#与 ... -
将ANTLR生成的.tokens文件重格式化(C++版)
2008-03-28 02:02 2411相关链接: 将ANTLR生成的.tokens文件重格式化(Ru ... -
奇怪的宏
2007-11-05 22:19 2083我C++确实不怎么样,不过近来不得不再唤醒那远古的记忆……即使 ...
相关推荐
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....
CRUD —— 增删改查(create、retrieve、update、delete) 同样是增改查,需要区分的是:create/ alter/ drop是对于数据库,表的操作,insert/ update/ delete是对数据的操作。 插入数据——INSERT INSERT INTO [([,...
CRUD —— 增删改查(Create、Retrieve、Update、Delete) CREATE / ALTER / DROP——对于数据库,表的操作 INSERT / UPDATE / DELETE —— 对数据的操作 1.插入数据——INSERT 包括: 插入元组 INSERT INTO [([,......
NULL 博文链接:https://gundumw100.iteye.com/blog/1935178
但必须注意的是,在表定义时说明了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...
NULL 博文链接:https://snandy.iteye.com/blog/1483186
Delete 基本信息删除=null; JMenuBar bar;//菜单条 JMenu fileMenu;//菜单 JMenuItem 录入,修改,查询,删除;//下拉菜单内容 Container con=null;//通用抽象容器包 Hashtable 基本信息=null; File file=null...
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...
1、在定义该属性的时候若说明NOT NULL时,不能取空值,否则会报错。 2、INTO语句中没有说明那些属性列,那在VALUES中要都提及,并且要按照定义的属性次序相同。若没有属性所对应的值,则用NULL。 3、字符串中的内容...
删除数据(DELETE) 3.6空值的处理 空值的产生 空值的判断 空值的约束条件 3.7视图 定义视图 查询视图 更新视图 视图的作用 ok 我们开始 3.5 数据更新 两种数据插入方式 插入元组 插入子查询结果 -可以一次插入多个...
本文以一个简单实例为大家介绍了SQL中truncate和delete的区别,帮助大家理解,具体内容如下 ---创建表Table1 IF OBJECT_ID('Table1','U') IS NOT NULL DROP TABLE Table1 GO CREATE TABLE Table1 (ID INT NOT NULL,...
使用与表示模型的对象(在方法参数中找到)相关联的HTTP DELETE 方法,属性都是 NULL。 为什么要尝试将数据放入请求正文中? 我目前正在做一个项目,要求在正文中,标识符(除了资源的信息已被压制)。 该模型允许...
C 语言编程常见问题解答 【作者】[美]Paul S.R. Chisholm 译:张芳妮 吕 波 【出版社】清华大学出版社 C语言编程常见问题解答(目录) 第l章 C语言 ... 1.... 1.... 1.... 1.... 1.... 1.... 1. 7 怎样才能知道循环... 17.6 怎样才能只...
NULL 博文链接:https://j2ee2009.iteye.com/blog/1005083