如何有效地阅读COleSafeArray

时间:2012-06-21 15:10:07

标签: c++ com

我发现很难找到可以解释如何阅读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;
}

此代码中是否存在可能导致内存泄漏的错误?

1 个答案:

答案 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析构函数清除数组的元素,因此您不必显式地销毁/释放它们。