C 中的delete不會將運算元置0

2022-09-26 10:03:28 字數 1099 閱讀 6036

考慮一下:

delete p;

// ...

delete p;

如果在...部分沒有涉及到p 的話,那麼第二個「delete p;」將是乙個嚴重的錯誤,因為c++的ucmnmysrvp實現(譯註:原文為a c++ implementation,當指vc++這樣的實現程式設計客棧了c++標準的具體工具)不能有效地防止這一點(除非通過非正式的預防手段)。既然delete 0從定義上來說是無害的,那麼乙個簡單的解決方案就是,不管在什麼地方執行了「deletep;」,隨後都執行「p=0;」。但是,c++並不能保證這一點。

乙個原因是,delete 的運算元並不需要乙個左值(lvalue)。考慮一下:

delete p+1;

delete f(x);

在這裡,被執行的delete 並沒有擁有乙個可以被賦予0 的指標。這些例子可能很少見,但它們www.cppcns.com的確指出了,為什麼保證「任何指向被刪除物件的指標都為0」是不可能的。繞過這條「規則」的乙個簡單的方法是,有兩個指標指向同乙個物件:

t* p = new t;

t* q = p;

delete p;

delete q; // 糟糕!

c++顯式地允許delete 操作將運算元左值置0,而且我曾經希望c++的實現能夠做到這一點,但這種思想看來並沒有在c++的實現中變得流行。

如果你認ucmnmysrvp為指標置0 很重要,考慮使用乙個銷毀的函式:

template i程式設計客棧nline void destroy(t*& p)

考慮一下,這也是為什麼需要依靠標準庫的容器、控制代碼等等,來將對new 和delete 的顯式呼叫降到最低限度的另乙個原因。

注意,通過引用來傳遞指標(以允許指標被置0)有乙個額外的好處,能防止destroy()在右值上(rvalue)被呼叫:

int* f();

int* p;

// ...

destroy(f()); // 錯誤:應該使用乙個非常量(non-const)的引用傳遞右值

destroy(p+1); // 錯誤:應該使用乙個非常量(non-const)的引用傳遞右值

本文標題: c++中的delete不會將運算元置0

本文位址:

C 中delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型別分配和 空間 2 為自...

C 中delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型別分配和 空間 2 為自...

C 中的delete和delete 區別

一直對c 中的delete和delete的區別不甚了解,今天遇到了,上網查了一下,得出了結論。做個備份,以免丟失。c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。關於 new 和 delete,其中又分為兩種...