zoukankan      html  css  js  c++  java
  • 条款13:以对象管理资源

    首先考虑一个工厂函数

    Investment * createInvestment();
    void f()
    {
        Investment * pInv = createInvestment();
        ...
            delete pInv;
    }

    至少上面这个函数是不安全的,例如如果...里面包含return语句的话,
    或者说...里面包含可能会抛出异常的语句。那么就会导致申请的内存得不到释放。
    而下面就说明了管理对象的一般方法:

    void f()
    {
        std::shared_ptr<Investment>(createInvestment());
        ...
    }

    用对象来进行管理,这样在离开作用域的时候申请的内存便会自动得到释放。
    注意这里包含有两个关键的想法:
    1. 获得资源之后应该把他们立刻放到管理对象里面。
    2. 管理对象可以利用析构函数使得资源正确的被释放。
    注意,shared_ptr等智能指针不能对内置的数组进行管理,因为他们在自己的析构函数里面调用的是

    delete而不是delete[], 例如下面这样就是不可取的:
    shared_ptr<int> spi(new int[1024]);    //不要这样做
    这种情况应该使用vector来代替:
    shared_ptr<vector> spi(new vector<int>); //像这样

    小结:
    1. 为防止资源泄露,应该使用RAII对象,他们在构造函数中获得资源,而在析构函数里面释放资源。
    2. auto_ptr不能用在多个指针指向同一个对象的场合。

  • 相关阅读:
    崔工读过的技术书籍,持续更新中!
    Python-S9——Day110-Git继续
    Python-S9——Day115-Flask Web框架
    树形dp 之 小胖守皇宫
    线性dp 之 奶牛渡河
    网课神器之obs-studio的安装使用
    Convert to Ones
    UVA 10653.Prince and Princess
    HDOJ 1051. Wooden Sticks
    洛谷P1063.能量项链
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4856320.html
Copyright © 2011-2022 走看看