【问题标题】:c++ smart pointers for directx用于directx的c++智能指针
【发布时间】: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:当pstd::shared_ptr 指向COM 对象时,调用p-&gt;Release() 没问题。然后你仍然有一个指针,但没有指针。我记得 ATL COM 指针\ 通过让 operator-&gt; 返回向下转换的指针到 AddRefRelease 是私有的接口来解决这个问题。无论如何,我就是这样做的。除了安全性之外,您还希望您的 COM 智能指针支持某些 COM 功能,例如转换为接口。

标签: c++ c++11 directx


【解决方案1】:

您似乎在 shared_ptr 上调用 operator()。这不是您构造 shared_ptr 的方式。尝试使用重置,或者在声明变量的同一行构造指针。

请注意,您调用的创建函数会为您提供一个引用计数为 1 的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2014-11-22
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多