3 资源管理

来源:互联网 发布:php实例 百度网盘 编辑:程序博客网 时间:2024/06/05 15:29
2017年8月11日 14:40:43



13 以对象管理资源
    把资源放进对象,利用对象的析构函数,自动释放资源

    可以使用“智能指针”来管理资源,标准库中提供 auto_ptr
    由于 auto_ptr 被销毁时,会自动删除它所指的空间,所以不要让多个 auto_ptr指向同一个空间。
    为了防止这个问题,auto_ptr 有一个规则:当使用copy构造和 赋值运算符时,他们就会变成 NULL,
    而复制所得的指针将取得资源的唯一拥有权。

    auto_ptr的代替方案:“计数型智能指针”(RCSP),持续追踪共有多少对象指向某笔资源,并在无人
    指向它时自动删除该资源。有些类似垃圾回收,但是RCSP无法打破环状引用。

        tr1::shared_ptr 就是一个RCSP

    注意:shared_ptr 和 auto_ptr 在其析构函数内,只做delete,不做 delete []动作
          因此不要用智能指针,指向数组


14 在资源管理类中小心copying行为
    在复制RAII对象(资源获取就初始化的对象)时,要一并复制它所管理的资源,资源的copying行为决定RAII对象的copying行为。
    常见的RAII class copying行为是:
        * 禁止copy
        * 施行引用计数法(用shared_ptr管理类内资源)
        * 深拷贝
        * 转移底部资源的拥有权


15 在资源管理类中提供对原始资源的访问
    operator int() const        类重载 强制类型转换
    {
        ...
    }

    一般来说,智能指针会提供 get() 方法,来获取原始资源,所以我们在编写时,也可以使用类似的方法


16 成对使用new和delete时,采用相同形式
    new ---- delete
    new [] ---- delete []


    如果有这样两个函数: 
    int func1(); 17 以独立语句将newed对象置入智能指针
 

    void func2(std::tr1::shared_ptr<MyClass> pw, int t);

    现在这样调用:
    func2(new MyClass(), func1());
    错误,因为shared_ptr禁止隐式转换(explicit),而它又需要一个原始指针,改成这样可以通过编译:
    func2(std::tr1::shared_ptr<MyClass> (new MyClass() ), func1());
    这样就有以下三件事要完成:
        * 执行函数func1()
        * 执行 new MyClass()
        * 调用shared_ptr的构造函数
    C++编译器,以什么样的次序,完成这些事情,弹性很大。
    所以次序不确定。如果func1(),第二个执行,并且抛出异常,第一个执行 new MyClass() 返回的指针 会内存泄漏。

    为了避免异常,应该以独立语句将newed对象,置入智能指针
    std::tr1::shared_ptr<MyClass> pw(new MyClass());
    fun2(pw,func1());