我之前写程序很少去考虑new了一个对象何时去delete。往往我不知道何时这个对象何时不用。
Investment* createInvestment(); void f() { Investment* pInv =createInvestment(); .... delete pInv; }
看到上面我们要考虑到2种情况:
1)当...处有有个条件判断并某个条件成立时return时,这就造成了内存泄露。
2)当我们后期维护时难免会在...处修改,这也有可能造成在delete之前发生异常。
所以 “我们依靠f()总能执行delete”是不靠谱的。
解决办法
利用标准库提供的auto_ptr,auto_ptr是类指针对象,也就是我们说的“智能指针”,使用如下:
void f() { std::auto_ptr<Investment> pInv(createInvestment()); //一如既往的使用pInv,经由auto_ptr的析构函数自动删除pInv; }
为了防止多个auto_ptr同时指向一个对象造成的重复删除对象,auto_ptrs有一个不同寻常的性质,若通过copy构造函数或copy assignment操作符复制它们时,它们会变成null,而复制所得指针将取得资源的唯一拥有权。
void f() { std::auto_ptr<Investment> pInv(createInvestment()); std::auto_ptr<Investment> pInv2(pInv); //pInv 变为Null pInv指向对象 pInv = pInv2 //pInv 指向对象 pInv2变为NULL }
auto_ptr的替代方案是RCSP(reference -counting smart pointor) .
如下:
void f() { std::tr1::shared_ptr<Investment> pInv(createInvestment()); std::tr1::shared_ptr<Investment> PInv2(pInv); //PInv和PInv2同时指向一个对象。 PInv = Pinv2; }
注意:std::auto_ptr 和 tr1::shared_ptr 只能调用delete,而不能deletep[];