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

  • 相关阅读:
    学习链接
    【转】C#学习路线WinForm学习路线
    WPF 等待动画控件
    wpf 设置窗体在屏幕的初始位置
    WPF 添加右键菜单 自定义透明控件
    记录自己的点滴
    Linux下的mysql默认大小写敏感
    springboot+mybatis遇到BUG:自动注入失败
    springboot在阿里CentOS 7后台永久运行
    阿里云CentOS7 64位安装jdk8和mysql5.6.43及远程连接mysql
  • 原文地址:https://www.cnblogs.com/onlycxue/p/3080912.html
Copyright © 2020-2023  润新知