在调用COM Release()函数后,指针是否被设置为空?
Should the pointer be set to null after calling COM Release() function?
假设我们有一个指向com接口的指针,所以我的问题是我们是否需要在Release()调用后将指针设置为空。或者COM如何处理它?
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
我假设pComInterface
是一个原始指针,声明如下:
IFoo* pComInterface
不,你不需要把它设为NULL——它只是你的局部变量。然而,IUnknown::Release
的调用是强制性的,因为你通知对象你释放了指针,并且对象可以安全地递减它的内部引用计数器,如果它有的话。
如果pComInterface
是指向某个COM接口的原始指针,那么从COM的角度来看,重要的事情是调用Release()
来适当地管理对象生命周期。(COM不知道在调用Release()
后是否将原始指针设置为NULL
)
然而,从良好的代码质量的角度来看,在调用Release()
之后,您应该将指针设置为NULL
(或者在c++ 11中更好的是nullptr
),以确保您没有对先前发布的COM对象的悬空引用,如果您有一些代码遵循Release()
。
(这与new
和delete
类似:必须在new
之后调用delete
才能正确释放对象的资源;您不"需要"在delete
之后将指针设置为nullptr
,但这是一个很好的编码实践,可以避免对已删除对象的悬空引用。
ATL::CComPtr
。这样,对Release()
(和AddRef()
)的适当调用将自动为您。(继续与new
和delete
进行比较,这与首选智能指针如shared_ptr
或unique_ptr
而不是原始拥有指针的建议相同。)
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 返回指向对象的指针的函数调用是否为 prvalue?
- 对象初始化中是否允许指向此成员的指针?
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 是否可以使用函数指针调用虚拟析构函数?
- std::less是否应该允许在编译时比较不相关的指针?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 成员访问是否在空指针上定义C++?
- 如果只有 std::auto_ptr 可用,我是否仍应该使用智能指针?
- 是否可以使用指针访问变量以避免直接编辑变量?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- "this"指针的值在对象的生存期内是否恒定?