程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中的delete不會將操作數置0

C++中的delete不會將操作數置0

編輯:關於C++

C++中的delete不會將操作數置0。本站提示廣大學習愛好者:(C++中的delete不會將操作數置0)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的delete不會將操作數置0正文


斟酌一下:

  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)的援用傳遞右值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved