C++中的delete不會將操作數(shù)置0
考慮一下:
delete p; // ... delete p;
如果在...部分沒有涉及到p 的話,那么第二個“delete p;”將是一個嚴(yán)重的錯誤,因為C++的實現(xiàn)(譯注:原文為a C++ implementation,當(dāng)指VC++這樣的實現(xiàn)了C++標(biāo)準(zhǔn)的具體工具)不能有效地防止這一點(除非通過非正式的預(yù)防手段)。既然delete 0從定義上來說是無害的,那么一個簡單的解決方案就是,不管在什么地方執(zhí)行了“deletep;”,隨后都執(zhí)行“p=0;”。但是,C++并不能保證這一點。
一個原因是,delete 的操作數(shù)并不需要一個左值(lvalue)。考慮一下:
delete p+1; delete f(x);
在這里,被執(zhí)行的delete 并沒有擁有一個可以被賦予0 的指針。這些例子可能很少見,但它們的確指出了,為什么保證“任何指向被刪除對象的指針都為0”是不可能的。繞過這條“規(guī)則”的一個簡單的方法是,有兩個指針指向同一個對象:
T* p = new T; T* q = p; delete p; delete q; // 糟糕!
C++顯式地允許delete 操作將操作數(shù)左值置0,而且我曾經(jīng)希望C++的實現(xiàn)能夠做到這一點,但這種思想看來并沒有在C++的實現(xiàn)中變得流行。
如果你認為指針置0 很重要,考慮使用一個銷毀的函數(shù):
template<class T> inline void destroy(T*& p) { delete p; p = 0; }
考慮一下,這也是為什么需要依靠標(biāo)準(zhǔn)庫的容器、句柄等等,來將對new 和delete 的顯式調(diào)用降到最低限度的另一個原因。
注意,通過引用來傳遞指針(以允許指針被置0)有一個額外的好處,能防止destroy()在右值上(rvalue)被調(diào)用:
int* f(); int* p; // ... destroy(f()); // 錯誤:應(yīng)該使用一個非常量(non-const)的引用傳遞右值 destroy(p+1); // 錯誤:應(yīng)該使用一個非常量(non-const)的引用傳遞右值
相關(guān)文章
C/C++產(chǎn)生指定范圍和不定范圍隨機數(shù)的實例代碼
C/C++產(chǎn)生隨機數(shù)用到兩個函數(shù)rand() 和 srand(),這里介紹不指定范圍產(chǎn)生隨機數(shù)和指定范圍產(chǎn)生隨機數(shù)的方法代碼大家參考使用2013-11-11使用設(shè)計模式中的單例模式來實現(xiàn)C++的boost庫
這篇文章主要介紹了使用設(shè)計模式中的單例模式來實現(xiàn)C++的boost庫的方法,其中作者對線程安全格外強調(diào),需要的朋友可以參考下2016-03-03詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09C++初學(xué)者之根據(jù)輸入的任何一個正整數(shù),輸出可能被表示的連續(xù)正整數(shù)
這篇文章主要介紹了C++初學(xué)者之根據(jù)輸入的任何一個正整數(shù),輸出可能被表示的連續(xù)正整數(shù)的相關(guān)資料,需要的朋友可以參考下2016-03-03C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
枚舉顧名思義就是把所有的可能性列舉出來,像一個星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個變量占據(jù)空間2021-11-11