【问题标题】:WinRT C++/CX Component ComPtr vs native PointerWinRT C++/CX 组件 ComPtr 与本机指针
【发布时间】:2012-09-23 10:36:45
【问题描述】:

我正在查看一些用于 WinRT 的 Direct3D 代码,并注意到那里的“参考类”使用“ComPtr<ID3D11Device1>”而不是“ID3D11Device1*”。所以我的问题是你必须在“ref class”中使用“ComPtr”还是可以使用“native pointer”来代替??

现在我在 ref 类中使用本机指针,因为我的 c++ 文件也用于编译托管 C++。但有时我在 WinRT 中会出现奇怪的行为,并认为这可能与 ComPtr 有关。

【问题讨论】:

  • 不,它只是一个小助手类,可以自动获取调用的 AddRef 和 Release 方法。

标签: c++ components microsoft-metro windows-runtime


【解决方案1】:

没必要用,但经常很方便。

它是管理 COM 对象生命周期的 COM 对象的引用计数智能指针。如果您使用原始指针,您通常无法保证 COM 对象仍然存在。如果您认为这可能与您的问题有关(例如,您在调用 COM 方法时遇到访问冲突),那么使用它们是有意义的。无论如何,与 COM 方法调用相比,引用计数的性能损失微不足道。

【讨论】:

  • 所以基本上如果我在方法 Foo() 中创建一个临时 ComPtr... 然后设置我的 GLOBAL object* = ComPtr.Get() 并离开方法 Foo() ComPtr 将自动释放对象* ??这将解释我遇到的问题。
  • @zezba9000:是的,在这种情况下它会破坏 COM 对象。对于全局对象,我绝对推荐使用 ComPtr
  • 感谢您的信息。我删除了 ComPtr 的所有用途,因为我的 API 已经设置为处理内存垃圾。不过,我似乎仍然对 Metro 中的 D3D11 有一些问题。
  • 发现我试图引用一些来自 C# 的托管内存并且它正在被垃圾收集。现在我的两个问题都解决了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多