使用std :: unique_ptr管理COM对象

时间:2014-02-17 03:40:21

标签: c++ c++11 com smart-pointers

我正在尝试使用智能指针来保存我的类中的COM对象,同时避免使用ComPtr。是否可以将unique_ptr用于此目的?

我对智能指针很陌生,到目前为止,我有点困惑。请考虑以下简化代码:

class Texture
{
private:
    struct ComDeleter
    {
        operator() (IUnknown* p)
        {
            p.Release();
            delete p;
        }
    }

    ID3D11Texture* m_dumbTexture;
    std::unique_ptr<ID3D11Texture, ComDeleter> m_smartTexture;

public:
    ID3D11Texture* getDumbTexture() const { return m_dumbTexture; }
    ID3D11Texture* getSmartTexture() const { return m_smartTexture.get(); } // what to return here?
}

Texture::Texture() :
    dumbTexture  (NULL),
    smartTexture (nullptr)
{
}

Texture::init()
{
    D3DX11CreateTexture(&m_dumbTexture);
    D3DX11CreateTexture(&m_smartTexture.get());  // error: '&' requires r-value
}

所以我的问题是:getter应该返回什么(raw pointer或unique_ptr instance)以及如何将unique_ptr传递给创建资源的函数?

2 个答案:

答案 0 :(得分:3)

  

我正在尝试使用智能指针来保存我的类中的COM对象,同时避免使用ComPtr

解决方案是使用ComPtr。如果你正在使用COM对象,unique_ptrComPtr的不良替代品。

ComPtr提供了处理COM对象和IUnknown的专用功能。例如,它内置了对安全接口查询的支持(通过As成员函数)。它也可用于out参数,这些参数在COM中很常见(通过GetAddressOf函数)。

答案 1 :(得分:0)

如果你真的想要部分重新发明轮子,你应该使用intrusive_ptr。通过调用IUnknownAddRef()实现Release()的递增/递减方法,它应该可以正常工作。