Using std::unique_ptr for managing COM objects

c++, c++11, com, smart-pointers

Solution

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).

Problem

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?

Original source