Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我必须使用ComPtr调用释放函数吗?_C++_Directx - Fatal编程技术网

C++ 我必须使用ComPtr调用释放函数吗?

C++ 我必须使用ComPtr调用释放函数吗?,c++,directx,C++,Directx,我正在使用智能指针或ComPtr。我在directX应用程序中使用它,我没有看到其他人在代码中使用ComPtr调用release函数。那么,智能指针是释放智能指针所引用的数据,还是需要手动释放?我不知道这是否有意义,如果没有,请告诉我,我会更详细地回答。您通常不需要通过智能指针调用AddRef或Release。ComPtr的整个要点是它为您调用这些 如果要将智能指针转换为“手动管理”(正常)指针,您可能仍需要调用它们。在ComPtr上,您永远不应该调用AddRef或Release,默认情况下您不

我正在使用智能指针或ComPtr。我在directX应用程序中使用它,我没有看到其他人在代码中使用ComPtr调用release函数。那么,智能指针是释放智能指针所引用的数据,还是需要手动释放?我不知道这是否有意义,如果没有,请告诉我,我会更详细地回答。

您通常不需要通过智能指针调用
AddRef
Release
ComPtr
的整个要点是它为您调用这些


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

ComPtr
上,您永远不应该调用
AddRef
Release
,默认情况下您不能。您必须使用类似于
comPtr.Get()->Release
的黑客模式来执行此操作,而且您很可能会导致问题

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

对于“转移所有权”有一些特殊的方法
Attach
Detach
,这样就不会改变ref计数,但它们是针对特殊用例的。您还可以使用
Swap
执行一些技巧,这些技巧对于健壮的编码非常有用

如果要显式地“释放”ComPtr变量,可以将其赋值为null,或者最好使用
Reset

就像所有你应该考虑的,你的指针的生命周期来决定如何使用它。如果函数或类将“拥有”指向的对象,那么使用智能指针是正确的方法。如果函数只是处理对象,然后在生命周期内返回而没有任何更改,则在调用函数时,应该使用ComPtr上的
Get
方法获取原始指针。否则,当对象的所有权实际上没有问题时,程序会浪费大量时间不必要地增加和减少ref计数

另一个选项是将智能指针参数作为
const ComPtr&
传递,这避免了ref计数循环,但它有一个副作用,即当原始指针对调用方的对象生存期策略更不可知,因此更灵活时,强制调用方使用
ComPtr

我有一篇关于如何在电脑上使用
ComPtr
的文章。你也可以看到

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

ComPtr:“创建表示模板参数指定的接口的智能指针类型。ComPtr自动维护基础接口指针的引用计数,并在引用计数变为零时释放接口。”源MSDN: