gpt4 book ai didi

c++ - 在 VARIANT 和 _variant_t 之间复制

转载 作者:行者123 更新时间:2023-11-30 01:00:55 25 4
gpt4 key购买 nike

我相当确定我可以安全地做:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com