我正在尝试使用智能指针来保存我的类中的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传递给创建资源的函数?
答案 0 :(得分:3)
我正在尝试使用智能指针来保存我的类中的COM对象,同时避免使用
ComPtr
。
解决方案是使用ComPtr
。如果你正在使用COM对象,unique_ptr
是ComPtr
的不良替代品。
ComPtr
提供了处理COM对象和IUnknown
的专用功能。例如,它内置了对安全接口查询的支持(通过As
成员函数)。它也可用于out参数,这些参数在COM中很常见(通过GetAddressOf
函数)。
答案 1 :(得分:0)
如果你真的想要部分重新发明轮子,你应该使用intrusive_ptr
。通过调用IUnknown
和AddRef()
实现Release()
的递增/递减方法,它应该可以正常工作。