欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

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

时间:2021-06-26 08:47:01|栏目: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++ const引用、临时变量 引用参数详解

栏    目:C代码

下一篇:基于C++实现的线程休眠代码

本文标题:C++中的delete不会将操作数置0

本文地址:http://www.codeinn.net/misctech/148391.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有