C++ 将智能指针分配给_variant_t是否需要手动AddRef()?

C++ 将智能指针分配给_variant_t是否需要手动AddRef()?,c++,visual-c++,smart-pointers,variant,C++,Visual C++,Smart Pointers,Variant,下面是一个示例片段: _variant_t var; var.vt = VT_UNKNOWN; var.punkVal = unknownInterfaceSmartPointer; unknownInterfaceSmartPointer->AddRef(); // Question Statement // Setting unknownInterfaceSmartPointer to some other container 这里是否真的需要手动AddRef?以下是比这更好

下面是一个示例片段:

_variant_t var;

var.vt = VT_UNKNOWN;

var.punkVal = unknownInterfaceSmartPointer;

unknownInterfaceSmartPointer->AddRef(); // Question Statement

// Setting unknownInterfaceSmartPointer to some other container
这里是否真的需要手动AddRef?以下是比这更好的方法:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());

您的想法?

如果您直接分配给
punkVal
成员(如您的第一个代码片段),那么您需要一个
AddRef()
——没有人会为您这样做。更好的方法是使用
操作符=()
成员
\u variant

_variant_t var;
var = unknownInterfaceSmartPointer.GetInterfacePointer();
或者按照您的建议执行-使用转换构造函数:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());
后两种变体都很好,不需要在代码中使用
AddRef()
,它将在
\u variant
实现中完成。此外,它们是有益的,因为如果您重新分配给相同的变量,则实现将为您进行适当的清理:

_variant_t var;
// if you assign a BSTR or smart pointer here
// you want it to be properly released later
var = whatever1();
// this will do the proper release of the previously
// stored stuff and then assign the new value
var = whatever2();

如果您直接分配给
punkVal
成员(如您的第一个代码片段),那么您需要一个
AddRef()
-没有人会为您这样做。更好的方法是使用
操作符=()
成员
\u variant

_variant_t var;
var = unknownInterfaceSmartPointer.GetInterfacePointer();
或者按照您的建议执行-使用转换构造函数:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());
后两种变体都很好,不需要在代码中使用
AddRef()
,它将在
\u variant
实现中完成。此外,它们是有益的,因为如果您重新分配给相同的变量,则实现将为您进行适当的清理:

_variant_t var;
// if you assign a BSTR or smart pointer here
// you want it to be properly released later
var = whatever1();
// this will do the proper release of the previously
// stored stuff and then assign the new value
var = whatever2();