国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

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

2020-01-26 14:35:26
字體:
來源:轉載
供稿:網友

考慮一下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仁寿县| 昌都县| 迁西县| 邓州市| 娄烦县| 林西县| 乌兰察布市| 金湖县| 德保县| 武功县| 龙泉市| 乌拉特后旗| 临邑县| 扬州市| 永德县| 公安县| 龙游县| 贺州市| 陵川县| 新化县| 彰化县| 通州市| 桂林市| 镇康县| 苗栗县| 连南| 七台河市| 阿拉善右旗| 天长市| 定襄县| 苏尼特右旗| 木里| 旬阳县| 贞丰县| 蚌埠市| 陵水| 木兰县| 南昌市| 德安县| 丰县| 行唐县|