2011-09-21 77 views
1

下面是一个例子片段:是否将智能指针分配给_variant_t需要手动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()); 

你的想法?

回答

1

如果你直接分配给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(); 
+0

很好,谢谢.. – AksharRoop