ATL CComPtr附加、分离和析构函数
ATL CComPtr Attach, Detach and Destructor
我想。。"附加"answers"分离"不会更改引用计数。但是CComPtr的析构函数调用释放它所包含的指针。
那么,每次使用attach时都有必要调用detach吗?。。。
{
CComPtr<IObj> pPtr;
pPtr.Attach(pPtr1);
.....//No detach on pPtr
}
正如您所提到的,Attach
/Detach
在设计上不会影响参考计数器。因此,当您有特殊需要跳过添加引用时,可以使用它们。否则,您可以用更自然的方式(构造函数、赋值运算符等)初始化指针。
您对Attach
的特殊需求通常是补偿已添加的外部引用。这样你的CComPtr
析构函数就可以在的时候正确地释放它
所以,不,您不必将Attach
和Detach
配对。当你必须这样做的时候,你应该不会首先使用Attach。
例如,Attach
:
{
// We have an oustanding reference on pRawFoo we want to safely compensate for
CComPtr pFoo;
pFoo.Attach(pRawFoo); // No effect on counter, but since here we would release
// the reference going out of scope
// ...
} // ~CComPtr releases the reference as intended
无需Attach
:
{
// External pRawFoo is in proper balance in terms of reference count
CComPtr pFoo;
pFoo = pRawFoo; // No need in Attach, pFoo adds a reference
// ...
} // ~CComPtr releases the reference as intended
与大多数智能指针一样,CComPtr<T>
表示所有权,并使用RAII语义来确保正确清理所拥有的资源。Attach
和Detach
方法用于转移所有权,部分原因是参考计数记账可能相对昂贵。因此,你需要在你的背景下回答的问题是所有权的模式是什么
当在两个CComPtr<T>
对象之间转移所有权时,会有匹配Attach
和Detach
调用的趋势,但它们将在单独的对象上:
spFoo2.Attach(spFoo1.Detach());
考虑以下片段,以及它们对IFoo
对象所有权的指示。m_spFoo
和spFoo
都是CComPtr<IFoo>
值:
HRESULT C::GetFoo_1(IFoo **ppFoo)
{
return m_spFoo.QueryInterface(ppFoo); // or m_spFoo.CopyTo(ppFoo)
}
HRESULT C::GetFoo_2(IFoo **ppFoo)
{
*ppFoo = m_spFoo.Detach();
return S_OK;
}
spFoo = obj.GetFoo_3();
spFoo.Attach(obj.GetFoo_4());
以下是我对这些片段的看法。
- 第一种是向调用方返回
IFoo
的非常常见的方式,遵循调用方接收具有递增引用计数的副本的常见语义 - 第二种是可以的,如果所有权被传递给调用者;调用方获取CCD_ 20对象先前具有的副本
- 第三种可能已经返回了
CComPtr<IFoo>
或CComPtr<IFoo>&
(非参考情况可能导致额外的参考计数记账),并且我们正在指示进一步的共享所有权;也就是说,我们希望将其保留更长的时间 - 第四个表示
GetFoo_4
中不寻常的语义,因为它一定提供了原始IFoo*
的引用计数,我们不想进一步增加
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- ATL CComPtr附加、分离和析构函数
- 为什么boost::thread的析构函数分离可接合线程,而不是像标准建议的那样调用terminate()