以前一直覺得連內存都管不好,會泄漏的人不適合當程序員
可是最近寫代碼確實的感受到這不是個簡單的問題
就舉個簡單的例子
class A{
public:
A(B *b){}
~A(){
//這裏要不要delete b?
}
private:
B *b;
}
int main(){
B *b = new B();
A *a = new A(b);
delete a;
delete b;//若A中delete b,這裏就會重複delete
}
這個情形還比較簡單,但是當這種嵌套越來越複雜時,就很難說能保證這中間不出錯
另外還有重複delete的問題,重複delete可能導致錯誤delete分配給別的變量的空間
一般delete後對指針置零,可以一定程度上避免這問題
但是像這裏的傳值的情況,置零就無法解決這問題
其實最好是有語言支持,給函數的指針參數加一個修飾詞:managed。(沒看過智能指針,找時間看看)
若是函數的情況,就表示在函數調用結束時,自動delete這個指針
若是類的情況,在對象銷燬時自動delete,這樣,在外部就不允許delete
或者乾脆給指針加個deleted域,new的時候置0,delete時置1,重複delete不操作
當然這只是妄想,使用者只能自己注意了,可能一個比較可行的方法是,變量命名規範
在變量名里加標記,表示當前域或者對象管不管它
下次有空自己定個規範。