我是否必须使用ComPtr调用释放功能?

时间:2016-03-21 23:46:45

标签: c++ directx

我正在使用智能指针或ComPtr。我在我的directX应用程序中使用它,我没有看到其他人使用ComPtr在其代码中调用release函数。那么智能指针是否会释放智能指针所指的数据,还是需要手动执行?我不知道是否这样做,因此告诉我它是否没有,我将以更好的细节作出回应。

2 个答案:

答案 0 :(得分:2)

您永远不应该在AddRef上致电ReleaseComPtr,默认情况下您不能。你必须使用像comPtr.Get()->Release这样的hacky模式来做这件事,而你最常会引起问题。

Microsoft::WRL::ComPtr的目的是在正常代码和处理C ++异常时自动清除COM指针。将ComPtr的副本复制到另一个ComPtr会自动增加ref-count,每次ComPtr变量超出范围时,它会自动减少ref-count。这大大简化了错误处理和清理,这就是为什么您正在查看的代码在调用Release时不会充斥。

有一些特殊方法AttachDetach用于转移所有权'因此不会更改引用计数,但它们适用于特殊用例。您还可以使用Swap执行一些技巧,这些技巧对于强大的编码非常有用。

如果您想明确'发布'一个ComPtr变量,您可以为其指定null或更好地使用Reset

与所有smart-pointers一样,您应该考虑指针的生命周期来决定如何使用它。如果某个职能部门或班级要自己拥有指向的对象,然后使用智能指针是正确的方法。如果该函数只是对该对象起作用,然后在生命周期内没有任何变化的情况下返回,则该函数应该使用原始指针,而不是在调用它时使用ComPtr上的Get方法。否则,当对象的所有权实际上没有问题时,你的程序浪费了大量时间,不必要地增加和减少ref-count。

  

另一种选择是将智能指针参数传递为const ComPtr&,这样可以避免引用计数循环,但是当原始指针位于时,它会产生副作用,强制调用者使用ComPtr与调用者的对象生存期策略更加不可知,因此更加灵活。

我已经了解了如何在DirectX Tool Kit wiki上使用ComPtr。您还可以看到MSDN

  

对于非COM对象,std::unique_ptr是一个很好的选择。您也可以使用std::shared_ptrstd::weak_ptr,但在共享案例中需要担心很多性能问题和边缘情况,因此坚持ComPtr用于COM和{{1}对于具有单个所有者的堆分配对象,这是最佳实践。

答案 1 :(得分:1)

您通常不需要通过智能指针调用AddRefRelease - ComPtr的整个点就是它为您调用的那些。

如果您将智能指针转换为"手动管理"您可能仍需要调用它们。 (正常)指针。