effective c++ 条款13 以对象管理资源

我之前写程序很少去考虑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[];

 

posted @ 2013-05-15 22:59  onlycxue  阅读(194)  评论(0编辑  收藏  举报