加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 一旦引用计数达到0,就让shared_ptr调用成员函数

发布时间:2020-12-16 10:42:31 所属栏目:百科 来源:网络整理
导读:我正在为一个不能与DuplicateHandle一起使用的HANDLE创建一个包装器,所以我试图将句柄包装在shared_ptr中. 想象一下以下代码: class CWrapper{public: CWrapper() : m_pHandle(new HANDLE,CWrapper::Close) { //code to open handle }private: void Close()
我正在为一个不能与DuplicateHandle一起使用的HANDLE创建一个包装器,所以我试图将句柄包装在shared_ptr中.

想象一下以下代码:

class CWrapper
{
public:
    CWrapper() :
        m_pHandle(new HANDLE,&CWrapper::Close)
    {
        //code to open handle
    }

private:
    void Close() 
    { 
        //code to close handle
    }

    std::shared_ptr<HANDLE> m_pHandle;
}

我也尝试使用HANDLE参数创建close(不理想).无论哪种方式,我得到编译器错误“术语不评估为采用0参数的函数”.这是因为隐含的这个指针吗?我该如何解决?如何从共享指针调用成员函数?

解决方法

我认为你的抽象方式是错误的.

shared_ptr为您提供了一个可复制的“句柄”,该句柄可以自行复制.将shared_ptr与在删除时不执行自己的清理的类型一起使用不是最佳用途.

如果让你的类承担在析构函数中正确清理这种固有的不可复制资源的责任,那么你可以使用shared_ptr来提供共享所有权,这是它应该承担的唯一责任. (我认为HANDLE是不可复制的,就像你试图制作HANDLE的简单副本一样,副本不能被视为独立;最后一个副本必须正确关闭,因此副本的所有者需要知道其他副本是否存在.)

class CWrapper
{
public:
    CWrapper()
    {
        // code to open handle
    }

    ~CWrapper()
    {
        // code to close handle
    }

private:
    // prevent copying
    CWrapper(const CWrapper&);
    CWrapper& operator=(const CWrapper&);

    HANDLE mHandle;
};

现在使用shared_ptr< CWrapper>在需要共享句柄的地方,如果您认为这样过于冗长,可以使用typedef.

自定义删除器是一个过于复杂的解决方案,恕我直言.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读