zoukankan      html  css  js  c++  java
  • 关于智能指针boost::shared_ptr

    boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎。

    但在实际的使用过程中,笔者也发现了一些不足。

    1、定制的删除器

    shared_ptr除了可以使用默认的delete删除器来删除资源, 也可以定制删除器来删除资源, 但是删除的时候没有办法返回值, 这应该可以算是一个缺陷。

    如对于文件句柄的操作

    bool CFileIO::Open(LPCTSTR fileName, LPCTSTR mode)
    {
        m_pFile.reset(_tfopen(fileName, mode), fclose);

        return m_pFile.unique();
    }

    bool CFileIO::Close(void)
    {
        m_pFile.reset();

        return true;
    }

    这时候Close没有办法返回实际的操作状态。

    2、函数没有办法把shared_ptr中保存的原始指针直接返回, 因为share_ptr在函数返回后会自动销毁,因此对应的资源也会被释放。如

    T *GetObject()

    {

      shared_ptr<T> ret;

      ...

      return ret.get();

    }

    究其原因,是因为shared_ptr没有一个接口, 可以像std::auto_ptr的release来手动释放所有权, 因此这种情况下只能使用auto_ptr了。

    3、对于shared_ptr为什么不引出接口operator T*() const, 我感到很奇怪。因为若是一个接口的形式如下

    template<class T>

    void func(T *p);

    这个时候如果直接传shared_ptr变量会编译出错。

    4、智能指针的陷阱

    在一个对象的析构函数里再把它传入某个智能指针对象,这样会引起循环析构。

    如:

    class CObject
    {
         ~CObject();
    }
    
    CObject::~CObject()
    {
        test(this);
    }
    
    void test(boost::shared_ptr<CObject> object)
    {
    }
  • 相关阅读:
    项目中常用的图片处理方案小结
    Unity2D实现人物三连击
    使用mescroll实现上拉加载与下拉刷新
    iOS中文输入法多次触发的问题及解决方案
    使用WebStorm将项目部署到IIS
    在Less中使用条件判断
    Vue+原生App混合开发手记#1
    在Vue中使用layer.js弹出层插件
    局域网简单的SVN服务器的搭建
    在iOS中实现sticky header
  • 原文地址:https://www.cnblogs.com/zilongblog/p/3372842.html
Copyright © 2011-2022 走看看