C++中的delete不會將運算元置0_C 語言

來源:互聯網
上載者:User

考慮一下:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.