我相当确定我可以安全地做:
void funcA(VARIANT &V,_variant_t &vt)
{
vt = V;
}
但反过来呢:
void funcB(VARIANT &V,_variant_t &vt)
{
V = vt;
}
我一直在我的应用程序中看到一些非常奇怪的行为,我将其归因于与 COM 相关的线程问题。但后来我想知道我是否错误地使用变体来搞砸内存。在 funcB 中,VARIANT V 是为 COM 调用准备的安全数组的一部分。对于我的 V=vt 行,我是否在做一个浅拷贝,当同一个变体被释放两次时,它会破坏事情?
我真的很喜欢 _variant_t 并避免使用所有::VariantXXX 方法,有没有一种巧妙的方法可以在 funcB 中使用 _variant_t 来自动复制?
最佳答案
首先,是的,通过像在 funcB()
中那样使用赋值运算符,您只调用浅拷贝(您可能想查看 oaidl.h 以查看 VARIANT
定义 - 它没有用户定义的赋值运算符,因此浅拷贝由编译器完成。
如果您从中复制的其他变体在您访问浅拷贝之前被清除(例如,如果变体类型是 VT_UNKNOWN
,则指向的对象可以简单地在之后被销毁通过调用 IUnknown::Release()
将引用计数设置为 0。
_variant_t
对您没有多大帮助,因为它没有复制到另一个对象的方法 - 请参阅类定义的 comutil.h - 它只会从另一个对象复制到自身。
最简单的方法是使用 VariantCopy()
。不确定在处理时是否会初始化 safearray。如果它是用具有 VT_EMPTY
的每个元素初始化的,您只需调用 VariantCopy()
。否则首先调用目标上的 VariantInit()
来初始化目标。为包含随机未初始化数据的目标调用 VariantCopy()
可能会导致未定义的行为。
关于c++ - 在 VARIANT 和 _variant_t 之间复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791447/