是否将智能指针分配给_variant_t需要手动AddRef()
Whether assigning smart pointer to _variant_t requires a manual 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()
-没有人会为您做这件事。一个更好的方法是使用_variant_t
的operator=()
成员:
_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();
相关文章:
- 在template中使用std::variant的template函数
- C++中原子的替代品<variant>
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 为 std::variant 提供一个运算符 ==
- 如何使用 std::variant 打印地图键/值?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 在 std::tuple 上使用 std::variant 的问题
- 如何访问存储在 std::variant 中的类的方法
- 更改其类型后,丢失对 std::variant 对象的引用
- 调用方如何知道 VARIANT 中何时有十进制?
- std::visit and std::variant usage
- std::variant vs指向C++中异构容器基类的指针
- std::variant<>::get() 不能使用 Apple LLVM 10.0 编译
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 按索引设置 std::variant 的值
- boost::variant - 如何分配值
- 在 std::variant 中按类型获取索引