我正在尝试使用智能指针在我的类中保存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_ptr
是 ComPtr
的糟糕替代品。
ComPtr
提供了用于处理 COM 对象和IUnknown
的专用功能。 例如,它内置了对安全接口查询的支持(通过 As
成员函数)。 它也可以使用在 COM 中常见的 out 参数(通过 GetAddressOf
函数)。
如果你真的想部分地重新发明轮子,你应该使用 intrusive_ptr
.通过调用AddRef()
和Release()
实现IUnknown
的递增/递减方法,它应该可以工作。