2016-03-21 104 views
0

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

+0

ComPtr:“创建一个智能指针类型,它表示由模板参数指定的接口.ComPtr自动维护底层接口指针的引用计数,并在引用计数为零时释放接口。源MSDN:https://msdn.microsoft.com/en-us/library/br244983.aspx –

回答

1

您不应该在ComPtr上拨打AddRefRelease,并且默认情况下您不能。你必须使用像comPtr.Get()->Release这样的hacky模式来做到这一点,而且你最喜欢会导致问题。

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

对于'转让所有权'有一些特殊的方法AttachDetach,这样ref-count不会改变,但它们是针对特殊用例的。您也可以使用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,但在共享的情况下会涉及很多性能影响和边缘情况,因此对于COM,坚持使用ComPtr,对于使用单个所有者的堆分配对象,坚持std::unique_ptr是最佳做法。

1

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

如果您将智能指针转换为“手动管理”(普通)指针,您可能仍然需要调用它们。

+0

谢谢! @immibis – CPlusPlusProgrammer

相关问题