C++中的delete不會將操作數(shù)置0
考慮一下:
delete p; // ... delete p;
如果在...部分沒有涉及到p 的話,那么第二個“delete p;”將是一個嚴重的錯誤,因為C++的實現(xiàn)(譯注:原文為a C++ implementation,當(dāng)指VC++這樣的實現(xiàn)了C++標準的具體工具)不能有效地防止這一點(除非通過非正式的預(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; }
考慮一下,這也是為什么需要依靠標準庫的容器、句柄等等,來將對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)的引用傳遞右值
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置