C++中的delete不會將操作數置0。本站提示廣大學習愛好者:(C++中的delete不會將操作數置0)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的delete不會將操作數置0正文
斟酌一下:
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)的援用傳遞右值