我发现很难找到可以解释如何阅读COleSafeArray
...
所以我有一个对象通过成员函数_variant_t
返回,实际上是COleSafeArray
。我想读它的元素并确保我没有泄漏记忆......
这是一种示例代码。我只是想读取数组的ifrst元素,我认为它是一个很长的。阵列中有更多数据。
class ExampleObject
{
_variant_t GetArray();
};
//...
long Read(ExmapleObject* ptr)
{
COleSafeArray the_array = ptr->GetArray();
VARIANT value_temp;
VariantInit(&value_temp);
long index = 0;
the_array.GetElement(&index, &value_temp);
long my_result = value_temp.lVal;
return my_result;
}
此代码中是否存在可能导致内存泄漏的错误?
答案 0 :(得分:1)
有效阅读COleSafeArray
内容是关于可靠性和性能的。
为了可靠地读取,避免垃圾和泄漏,您应该检查数组本身和元素的类型。 .vt
字段告诉您数组的类型,它可能是特定[固定]类型的数组,或VARIANT
的数组,而后者可能嵌入子数组。
您可以选择使用GetElement
获取单个元素,在这种情况下if the data element is a string, object, or variant, the function copies the element in the correct way,因此您负责清除副本。要通过包装器类为您完成,请将元素放入CComVariant
类变量,而不是VARIANT
struct(~CComVariant
将为您清理)。
或者,如果选择了类型,则可以锁定/解锁数组并获得对阵列管理的元素的直接访问。您可能更喜欢这种方法的性能,因为您锁定一次并在需要时进行复制,而不是在先前的访问选项中为每个元素设置锁和副本。
~COleSafeArray
析构函数清除数组的元素,因此您不必显式地销毁/释放它们。