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)
    {
    }
  • 相关阅读:
    反射获取成员方法并运行
    反射获取成员变量,并修改值
    反射获取私有的构造方法运行
    反射获取构造方法并运行的快速的方式
    通过反射,获取有参数的构造方法并运行
    ssh端口映射
    python常见环境安装
    hadoop fs管理文件权限
    oracle通过DBlink连接mysql(MariaDB)
    [mysq]ERROR 2006 (HY000) at line xx: MySQL server has gone away 解决方法
  • 原文地址:https://www.cnblogs.com/zilongblog/p/3372842.html
Copyright © 2011-2022 走看看