美文网首页
effective C++ 笔记:条款15 在资源管理类中提供对

effective C++ 笔记:条款15 在资源管理类中提供对

作者: jun_hinokeso | 来源:发表于2018-08-20 22:08 被阅读0次

    资源管理类是对抗资源泄漏的有效手段,你依赖这个类的操作来代替本来应该手动处理资源的繁琐操作。
    但是这样并不完美,应该有些API直接使用资源,举个例子:

    shared_ptr<Investment> pInv(createInvestment()); //见条款13
    int days(const Investment* p);                  //一个直接调用Investment对象的函数
    int d = days(pInv);                           //错误,pInv类型不是 Investment*
    

    这时候有两种办法:1)显式转换 2)隐式转换

    1)显式转换
    shared_ptr 和 auto_ptr都提供了一个get成员函数,可以获得智能指针内部的原始指针的拷贝:

    int days = days(pInv.get());
    

    并且重载了->和*

    pInv->fun();    //fun()是Investment类中的函数
    (*pInv).fun();
    
    1. 隐式转换
    class Font{
    public:
        ...
        operator FontHandle() const{ return f;}
    private:
        FontHandle f;
    };
    
    Font F;
    void fun(FontHandle f); //fun函数声明
    fun(F);                //这样就可以将F中的f传给fun
    

    但是这里有一个问题,见如下代码:

    Font F;
    FontHandle f2 = F;  //这里程序员本意是想拷贝一个Font对象,却错写成了FontHandle
    

    这样错误地得到了一个FontHandle对象,当F被释放的时候,实际上f2的内容其实也已经被销毁了。

    总结:
    1.资源管理类应该提供一个能够取得其所管理的资源的方法。
    2.一般显式转换比较安全,隐式转换对客户来说用起来方便。

    相关文章

      网友评论

          本文标题:effective C++ 笔记:条款15 在资源管理类中提供对

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