Using std::unique_ptr for managing COM objects

萝らか妹 提交于 2019-12-23 12:39:02

问题


I'm trying to use smart pointers to hold COM objects in my class while avoiding ComPtr. Is it possible to use unique_ptr for this purpose?

I'm quite new to smart pointers and so far I'm a bit confused. Please consider the following simplified code:

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
}

So my problems are: what should the getter return (raw pointer or unique_ptr instance) and how can I pass the unique_ptr to function which creates the resource?


回答1:


I'm trying to use smart pointers to hold COM objects in my class while avoiding ComPtr.

The solution is to use ComPtr. unique_ptr is a poor substitute for ComPtr if you're working with COM objects.

ComPtr provides specialized functionality for working with COM objects and IUnknown. For example, it has built in support for safe interface querying (via the As member function). It is also usable with out parameters, which are common in COM (via the GetAddressOf functions).




回答2:


If you really want to partially reinvent the wheel, you should use intrusive_ptr. Implement the incrementation/decrementation methods for IUnknown with calling AddRef() and Release() and it should work.



来源:https://stackoverflow.com/questions/21820301/using-stdunique-ptr-for-managing-com-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!