C++中的delete不会将操作数置0
2016-05-22 09:40
567 查看
考虑一下:
delete p; // ... delete p;
如果在...部分没有涉及到p 的话,那么第二个“delete p;”将是一个严重的错误,因为C++的实现(译注:原文为a C++ implementation,当指VC++这样的实现了C++标准的具体工具)不能有效地防止这一点(除非通过非正式的预防手段)。既然delete 0从定义上来说是无害的,那么一个简单的解决方案就是,不管在什么地方执行了“deletep;”,随后都执行“p=0;”。但是,C++并不能保证这一点。
一个原因是,delete 的操作数并不需要一个左值(lvalue)。考虑一下:
delete p+1; delete f(x);
在这里,被执行的delete 并没有拥有一个可以被赋予0 的指针。这些例子可能很少见,但它们的确指出了,为什么保证“任何指向被删除对象的指针都为0”是不可能的。绕过这条“规则”的一个简单的方法是,有两个指针指向同一个对象:
T* p = new T; T* q = p; delete p; delete q; // 糟糕!
C++显式地允许delete 操作将操作数左值置0,而且我曾经希望C++的实现能够做到这一点,但这种思想看来并没有在C++的实现中变得流行。
如果你认为指针置0 很重要,考虑使用一个销毁的函数:
template<class T> inline void destroy(T*& p) { delete p; p = 0; }
考虑一下,这也是为什么需要依靠标准库的容器、句柄等等,来将对new 和delete 的显式调用降到最低限度的另一个原因。
注意,通过引用来传递指针(以允许指针被置0)有一个额外的好处,能防止destroy()在右值上(rvalue)被调用:
int* f(); int* p; // ... destroy(f()); // 错误:应该使用一个非常量(non-const)的引用传递右值 destroy(p+1); // 错误:应该使用一个非常量(non-const)的引用传递右值
您可能感兴趣的文章:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- oracle数据库删除数据Delete语句和Truncate语句的使用比较
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- delete from 表名与truncate table 表名区别
- drop,truncate与delete的区别
- mysql delete limit 使用方法详解
- MySQL DELETE语法使用详细解析
- ORACLE SQL-UPDATE、DELETE、INSERT优化和使用技巧分享
- sqlserver中delete、update中使用表别名和oracle的区别
- 详解SQL中drop、delete和truncate的异同
- SQL Server中的XML数据进行insert、update、delete
- C++联合体转换成C#结构的实现方法
- 浅析drop user与delete from mysql.user的区别
- SQL Server中的XML数据进行insert、update、delete操作实现代码
- MySQL中UPDATE与DELETE语句的使用教程