以前一直觉得连内存都管不好,会泄漏的人不适合当程序员
可是最近写代码确实的感受到这不是个简单的问题
就举个简单的例子
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不操作
当然这只是妄想,使用者只能自己注意了,可能一个比较可行的方法是,变量命名规范
在变量名里加标记,表示当前域或者对象管不管它
下次有空自己定个规范。