美文网首页
Effective C++ Chapter3-资源管理

Effective C++ Chapter3-资源管理

作者: 寒冰豌豆 | 来源:发表于2017-03-16 18:10 被阅读0次

    13:以对象管理资源 Use object to manager resources

    • 将资源放进对象内,当控制流离开,该对象会析构函数自动释放那些资源;把资源放进对象内,我们可以依赖C++的析构函数自动调用机制确保资源被释放。
    • RAII “资源获得时机便是初始化时机” “Resource Acquisition Is Initializaton”
    • 例如 可以降资源仿如智能指针 auto_ptr 或 tr1::shared_ptr
    • shared_ptr采用引用计数,多个指针可以指向同一个对象;auto_ptr就不能,只能运行一个指针指向一个对象:如果要指针赋值,那么原来的指针要放弃对该对象的所有权。
    • shared_ptr在最新的c++11中,已经被列入了标准指针,而auto_ptr则出局了。
      shared_ptr采用RAII技术,是防止内存泄露的神器。
    # include <iostream>
    # include <tr1/memory>
    using namespace std;
    class A {
    public:
        A() {
            cout << "construct A!!!" << endl;
        }
           ;
        ~A() {
            cout << "destruct A!!!" << endl;
        }
        ;
    };
    class B: public A {
    public:
        B() {
            cout << "construct B!!!" << endl;
        }
        ;
        ~B() {
            cout << "destruct B!!!" << endl;
        }
        ;
    };
    int main() {
    //  B* ptrB0 = new B();
        std::tr1::shared_ptr<B> ptrB1(new B());
    }
    //输出:
    construct A!!!
    construct B!!!
    destruct B!!!
    destruct A!!!
    

    14:在资源管理类中小心copying行为

    • 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
    • 普通而常见的RAII class copying 行为是:抑制copying(例如把它设置为私有)、施行引用计数法。不过其他行为也可能被实现。

    15:在资源管理类中提供对原始数据的访问

    • APIs往往要求访问原始资源,所以每一个资源应该提供一个“去的其所管理之资源”的方法。
    • 对原始资源的访问可能经由显示转换或1隐式转换。一般而言显示转换比较安全,但隐式转换比较方便客户。

    16:成对使用new 和delete时,采用相同形式。

    std::string* stringPtr1 = new std::string;
    std::string* stringPtr2 = new std::string[100];
    delete stringPtr1; //删除一个对象
    delete stringPtr2[ ]; //删除一个由对象组成的数组
    
    typedef std::string AddressLines[4]   //尽量不要这样用
    std::string* pal = new AddressLines;
    //返回一个string* , 就像“new AddressLines[4]”一个
    //上面就必须使用一个数组形式的delete[ ]
    

    17:已独立的语句将newed对象置入智能指针

    • 以独立的语句将新建的对象存储于(置于)智能指针内。如果不这样做,一旦异常被抛出,有可能发生难以察觉的错误。

    相关文章

      网友评论

          本文标题:Effective C++ Chapter3-资源管理

          本文链接:https://www.haomeiwen.com/subject/gkljnttx.html