【发布时间】:2012-12-10 14:56:03
【问题描述】:
我最近一直在用 c++11 智能指针替换我所有的原始指针,现在我终于完成了,除了我的 DirectX 长指针。
我想实现以下内容:
std::shared_ptr<IDirect3D9> p_d3d;
p_d3d( Direct3DCreate9(D3D_SDK_VERSION), [](IDirect3D9 *p) {//smart pointer initialization(1)
p->Release();
});
我从 Visual Studio 收到以下错误:
error : 在没有适当的情况下调用类类型的对象 operator() 或将函数转换为函数指针类型
我更喜欢使用 std::unique_ptr 或 std::shared_ptr 而不是 CComPtr。 关于为什么会发生这种情况以及可能的实施方法的任何想法?
【问题讨论】:
-
声明变量时初始化完成。
-
C++ 智能指针不支持 COM 对象所依赖的引用计数语义。建议您使用 COM 智能指针。
-
拥有两个相互竞争的引用计数方案并不是一个好主意。特别是对于您的预期方案,当您拥有一组指向它的智能指针时,可以销毁所引用的对象。而是构建您自己的 COM 智能指针。如果您使用的是 Boost 库,则可以使用
boost::intrusive_ptr来节省一些工作(如果我没记错它的名字的话)。不幸的是,C++11 标准并未采用该构建块。 -
@cheers 我自己不明白。所有 shared_ptr 的集合可以共享一个 com 引用计数。当它们都消失时,最后一个释放它。这里没有比拥有一个拥有 CComPtr 成员变量的 shared_ptr 拥有的对象更多的问题。
-
@Yakk:当
p是std::shared_ptr指向COM 对象时,调用p->Release()没问题。然后你仍然有一个指针,但没有指针。我记得 ATL COM 指针\ 通过让operator->返回向下转换的指针到AddRef和Release是私有的接口来解决这个问题。无论如何,我就是这样做的。除了安全性之外,您还希望您的 COM 智能指针支持某些 COM 功能,例如转换为接口。