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[];

原文链接: https://www.cnblogs.com/onlycxue/archive/2013/05/15/3080912.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88608

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午11:43
下一篇 2023年2月9日 下午11:43

相关推荐