C++中的delete不会将操作数置0_C 语言

考虑一下:

  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
, C++中的delete
, c中delete的用法
中delete
c语言delete、c语言delete函数、c语言delete语句、delete操作符、汇编语言不会编,以便于您获取更多的相关知识。

时间: 2024-11-09 05:07:58

C++中的delete不会将操作数置0_C 语言的相关文章

c c++-析构函数中使用delete报错

问题描述 析构函数中使用delete报错 把析构函数里的delete去掉就不会报错了:但是搞不懂:我的构造函数里不是用了new吗,为什么会出现这种情况? 报错信息是:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),网上查了一下都说是重发调用delete的结果,但是我好像没有那么做. //Matrix.h class Matrix { public: Matrix(); ~Matrix(); Matrix(int,double*); //矩阵行列数.数组指针 Matr

Javascript中的delete操作符详细介绍_基础知识

一.变量 说到javascript中的delete操作符,还是首先要搞清楚javascript中的变量和属性之间的关系. javascript中,变量和对象属性关系非常微妙,甚至可以很多时候会被等同起来,因为 javascript 在执行脚本之前会创建一个global对象,在浏览器中就是window对象,所有的全局变量都是这个global对象的属性,执行函数时也会创建一个activation对象,所有的局部变量都是这个activation对象的属性.这些可以大家可以去了解一下javascript

Javascript中的delete介绍_javascript技巧

一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的属性: 复制代码 代码如下: var o = { x: 1 }; delete o.x; // true o.x; // undefined 但不以删除像这样声明的变量: 复制代码 代码如下: var x = 1; delete x; // false x; // 1 也不能删除像这样定义的函数:

数据库开发——参照完整性——在外键中使用Delete on cascade选项

原文:数据库开发--参照完整性--在外键中使用Delete on cascade选项 原文: http://www.mssqltips.com/sqlservertip/2743/using-delete-cascade-option-for-foreign-keys/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012731   参照完整性在设计数据库时需要重视,在我

MySQL和Oracle中的delete,truncate对比

在MySQL和Oracle中的delete,truncate还是存在着一些差别,明白了这些差别可能对于处理问题,理解问题会有一些帮助. 我们来简单通过一些测试来说明.我们创建两个表test_del,test_tru来对比delete,truncate的操作.我们有一个临时表t_fund_info大概有几百万的数据量. 创建test_del > create table test_del select *from t_fund_info; Query OK, 1998067 rows affect

网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要

问题描述 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 解决方案 php是一种web脚本语言,它主要用来编写应用层.web应用层需要iis或者apache这样的web服务器去执行.只使用php其实也可以开发一个完整的服务器端程序了.如果你希望一部分业务放在客户端执行,那么需要用js脚本.如果你希望调用一些别的语言的库,或者出于性能的优化,可以用C++写dll,用php模块加载.

层次聚类-道路网络中基于边的静态聚类算法的C语言实现

问题描述 道路网络中基于边的静态聚类算法的C语言实现 如何表示多条边以及边与边交点,然后就是聚类算法的实现过程,最好是single-link实现

android-Android中可以在一个activity类里内置一个service类吗

问题描述 Android中可以在一个activity类里内置一个service类吗 我写了一个倒计时的程序,我想让手机关闭屏幕时这个倒计时功能仍能继续,目前我的程序虽然在屏幕关闭时仍能进行倒计时功能,但是屏幕关闭久了这个倒计时功能会停止,设计的倒计时界面也会关闭(虽然这个界面我在一个service中写了一个广播,只要屏幕关闭这个activity就会启动,但屏幕关闭久了倒计时仍会停止),所以我想写个service,让启动倒计时功能的方法长驻,这行不行得通?或者大神们有更好的思路吗? 解决方案 不知

windows-Windows 8中做Metro风格的游戏用哪种语言好

问题描述 Windows 8中做Metro风格的游戏用哪种语言好 微软在Windows8中提供了各种库支持Metro风格的应用开发,但是在现阶段使用这种HTML5开发方式是否真的合适,尤其是做游戏是否还是延续C#更好?到底是技术成熟好,还是技术前优,请有经验的大虾指点一二. 解决方案 我认为应该是技术优先比较好.html5毕竟是未来的一种趋势,底子先打好,以后扩展起来也会容易些.