Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ ATL CComPtr连接、分离和析构函数_C++_Visual C++_Com_Atl - Fatal编程技术网

C++ ATL CComPtr连接、分离和析构函数

C++ 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的析构函数在它包含的指针上调用release

那么,每次使用attach时是否有必要调用detach

{
    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());