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