gpt4 book ai didi

c++ - 我是否必须使用 ComPtr 调用释放函数?

转载 作者:行者123 更新时间:2023-11-30 02:32:42 25 4
gpt4 key购买 nike

我正在使用智能指针或 ComPtr。我在我的 directX 应用程序中使用它,我还没有看到其他人使用 ComPtr 在他们的代码中调用发布函数。那么智能指针是释放智能指针指向的数据还是需要我手动释放呢?我不知道这是否可行,所以请告诉我是否可行,我会更详细地回复。

最佳答案

你不应该在 ComPtr 上调用 AddRefRelease,默认情况下你不能。您必须使用像 comPtr.Get()->Release 这样的 hacky 模式来执行此操作,而且您很可能会导致问题。

Microsoft::WRL::ComPtr 的目的是让 COM 指针自动清理,无论是在正常代码中还是在处理 C++ 异常时。将一个 ComPtr 复制到另一个 ComPtr 会自动增加引用计数,每次 ComPtr 变量超出范围时,它都会自动减少引用计数。这极大地简化了错误处理和清理,这就是为什么您正在查看的代码没有充斥着对 Release 的调用。

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

如果你想显式地“释放”一个 ComPtr 变量,你可以给它赋值 null 或者更好的方法是使用 Reset

与所有 smart-pointers 一样你应该考虑你的指针的生命周期来决定如何使用它。如果函数或类要“拥有”指向的对象,那么使用智能指针是正确的方法。如果该函数只是与该对象一起工作,然后在生命周期内没有任何变化地返回,则该函数应该采用原始指针,而不是您在调用它时使用 ComPtr 上的 Get 方法。否则,当对象的所有权实际上没有问题时,您的程序会浪费大量时间不必要地增加和减少引用计数。

Another option is to pass the smart-pointer parameter as const ComPtr& which avoids the ref-count cycling, but it has the side-effect of forcing the caller to use ComPtr when the raw pointer is more agnostic to the caller's object lifetime policy and therefore more flexible.

我有一篇关于如何在 DirectX Tool Kit wiki 上使用 ComPtr 的文章.您还可以查看 MSDN .

For non-COM objects, std::unique_ptr is a great option. You can also use std::shared_ptr and std::weak_ptr but there are a lot of performance implications and edge-cases to worry about in the shared case, so sticking to ComPtr for COM and std::unique_ptr for heap-allocated objects with a single-owner is best practice.

关于c++ - 我是否必须使用 ComPtr 调用释放函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com