如果在...部分沒有涉及到p的話,那么第二個“delete p;”將是一個嚴重的錯誤,因為C++的實現(譯注:原文為a C++ implementation,當指VC++這樣的實現了C++標準的具體工具)不能有效地防止這一點(除非通過非正式的預防手段)。既然delete 0從定義上來說是無害的,那么一個簡單的解決方案就是,不管在什么地方執行了“delete p;”,隨后都執行“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)的引用傳遞右值
我能夠寫“void main()”嗎?
這種定義:
void main() { /* ... */ }
在C++中從未被允許,在C語言中也是一樣。參見ISO C++標準3.6.1[2]或者ISO C標準5.1.2.2.1。規范的實現接受這種方式:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/