使用 std::unique_ptr 管理 COM 对象



我正在尝试使用智能指针在我的类中保存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 应该返回什么(原始指针或unique_ptr实例),我如何将unique_ptr传递给创建资源的函数?

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

解决方案是使用 ComPtr . 如果您正在使用 COM 对象,unique_ptrComPtr 的糟糕替代品。

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

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

相关内容

  • 没有找到相关文章

最新更新