C++ ATL CComPtr连接、分离和析构函数
我想。。 附着和分离不会更改引用计数。 但是CComPtr的析构函数在它包含的指针上调用release 那么,每次使用attach时是否有必要调用detachC++ ATL CComPtr连接、分离和析构函数,c++,visual-c++,com,atl,C++,Visual C++,Com,Atl,我想。。 附着和分离不会更改引用计数。 但是CComPtr的析构函数在它包含的指针上调用release 那么,每次使用attach时是否有必要调用detach { CComPtr<IObj> pPtr; pPtr.Attach(pPtr1); .....//No detach on pPtr { CComPtr pPtr; pPtr.附件(pPtr1); ..…//pPtr上没有分离 }如您所述,连接/分离不会影响参考计数器的设计。因此,当您特别需要跳过添
{
CComPtr<IObj> pPtr;
pPtr.Attach(pPtr1);
.....//No detach on pPtr
{
CComPtr pPtr;
pPtr.附件(pPtr1);
..…//pPtr上没有分离
}如您所述,
连接
/分离
不会影响参考计数器的设计。因此,当您特别需要跳过添加引用时,可以使用它们。否则,将以更自然的方式(构造函数、赋值运算符等)初始化指针
您对附加的特殊需求通常是补偿已添加的外部引用。这样,您的CComPtr
析构函数将在需要时正确释放它
因此,不必将附加
与分离
配对。当您必须这样做时,您应该不会首先使用Attach
例如,附加
:
{
//我们有一个关于pRawFoo的著名参考资料,我们希望安全地进行补偿
首席财务官pFoo;
pFoo.Attach(pRawFoo);//对计数器没有影响,但从这里开始我们将释放
//引用超出了范围
// ...
}//~CComPtr按预期释放引用
无需在中附加:
{
//外部pRawFoo在参考计数方面处于适当平衡状态
首席财务官pFoo;
pFoo=pRawFoo;//不需要附加,pFoo添加一个引用
// ...
}//~CComPtr按预期释放引用
如您所述,连接
/分离
设计上不会影响参考计数器。因此,当您特别需要跳过添加引用时,可以使用它们。否则,将以更自然的方式(构造函数、赋值运算符等)初始化指针
您对附加的特殊需求通常是补偿已添加的外部引用。这样,您的CComPtr
析构函数将在需要时正确释放它
因此,不必将附加
与分离
配对。当您必须这样做时,您应该不会首先使用Attach
例如,附加
:
{
//我们有一个关于pRawFoo的著名参考资料,我们希望安全地进行补偿
首席财务官pFoo;
pFoo.Attach(pRawFoo);//对计数器没有影响,但从这里开始我们将释放
//引用超出了范围
// ...
}//~CComPtr按预期释放引用
无需在中附加:
{
//外部pRawFoo在参考计数方面处于适当平衡状态
首席财务官pFoo;
pFoo=pRawFoo;//不需要附加,pFoo添加一个引用
// ...
}//~CComPtr按预期释放引用
与大多数智能指针一样,CComPtr
表示所有权,并使用RAII语义确保正确清理所拥有的资源。使用Attach
和Detach
方法转移所有权,部分原因是参考计数记账可能相对昂贵。因此,在你的上下文中,你需要回答的问题是所有权的模式是什么
在两个CComPtr
对象之间转移所有权时,会有匹配Attach
和Detach
调用的趋势,但它们将位于单独的对象上:
spFoo2.Attach(spFoo1.Detach());
考虑以下代码片段以及它们所表示的IFoo
对象的所有权。m_spFoo
和spFoo
都是CComPtr
值:
HRESULT C::GetFoo_1(IFoo **ppFoo)
{
return m_spFoo.QueryInterface(ppFoo); // or m_spFoo.CopyTo(ppFoo)
}
以下是我对这些片段的看法
- 第一种是将
IFoo
返回给调用者的一种非常常见的方法,遵循通常的语义,其中调用者接收具有递增引用计数的副本
- 如果所有权被传递给调用方,则第二个是可以的;调用方获取
C
对象以前拥有的副本
- 第三种情况可能是已经返回了
CComPtr
或CComPtr&
(非参考案例可能导致额外的参考计数记账),我们表示进一步共享所有权;也就是说,我们希望将其保留更长时间
- 第四个表示
GetFoo_4
中的异常语义,因为它必须在原始IFoo*
上提供一个引用计数,我们不想进一步增加该计数
与大多数智能指针一样,CComPtr
表示所有权,并使用RAII语义确保正确清理所拥有的资源。使用Attach
和Detach
方法转移所有权,部分原因是参考计数记账可能相对昂贵。因此,在你的上下文中,你需要回答的问题是所有权的模式是什么
在两个CComPtr
对象之间转移所有权时,会有匹配Attach
和Detach
调用的趋势,但它们将位于单独的对象上:
spFoo2.Attach(spFoo1.Detach());
考虑以下代码片段以及它们所表示的IFoo
对象的所有权。m_spFoo
和spFoo
都是CComPtr
值:
HRESULT C::GetFoo_1(IFoo **ppFoo)
{
return m_spFoo.QueryInterface(ppFoo); // or m_spFoo.CopyTo(ppFoo)
}
以下是我对这些片段的看法
- 第一种是将
IFoo
返回给调用者的一种非常常见的方法,遵循通常的语义,其中调用者接收具有递增引用计数的副本
- 如果所有权被传递给调用方,则第二个是可以的;调用方获取
C
对象以前拥有的副本
- 第三种情况可能是已经返回了
CComPtr
或CComPtr&
(非参考案例可能导致额外的参考计数记账),我们表示进一步共享所有权;也就是说,我们想让它保持更长的时间
spFoo.Attach(obj.GetFoo_4());