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?
The solution is to use
ComPtr
.unique_ptr
is a poor substitute forComPtr
if you're working with COM objects.ComPtr
provides specialized functionality for working with COM objects andIUnknown
. For example, it has built in support for safe interface querying (via theAs
member function). It is also usable with out parameters, which are common in COM (via theGetAddressOf
functions).If you really want to partially reinvent the wheel, you should use
intrusive_ptr
. Implement the incrementation/decrementation methods forIUnknown
with callingAddRef()
andRelease()
and it should work.