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

Whether assigning smart pointer to _variant_t requires a manual AddRef()?

本文关键字:AddRef variant 智能 指针 分配 是否      更新时间:2023-10-16

下面是一个示例代码片段:

_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() -没有人会为您做这件事。一个更好的方法是使用_variant_toperator=()成员:

_variant_t var;
var = unknownInterfaceSmartPointer.GetInterfacePointer();

或者按照您的建议—使用转换构造函数:

_variant_t var(unknownInterfaceSmartPointer.GetInterfacePointer());

后两种变体都很好,不需要在代码中使用AddRef() -它将在_variant_t实现中完成。此外,它们是有益的,因为如果您对相同的变量重新赋值,实现将为您进行适当的清理:

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