【发布时间】:2014-03-16 05:32:23
【问题描述】:
我正在尝试使用智能指针在我的类中保存 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 传递给创建资源的函数?
【问题讨论】:
-
这属于重新发明轮子的范畴。使用 ComPtr 并继续前进。
-
p.Release(); delete p;错误:COM 对象在最后一个Release()上自行销毁。 -
所以不需要
delete p?看来我一直在阅读一些错误的教程。 -
delete p是非常错误。你有什么保证 COM 对象是用 C++ 的new分配的,并且来自你的 C++ 库为你设置的同一个堆? (提示:绝对不是 DX 对象的情况)。 COM 对象管理自己的生命周期的一个主要原因是因为它们是唯一知道释放自己的正确方法的对象。 -
@PeterR 发现了这个问题并对其表示赞同,我想我的第一个想法是关于代码重用和可移植性。为了这些目的而避免使用特定于 Windows 的代码是有意义的。
标签: c++ c++11 com smart-pointers