1

読み方を説明する明確な例を見つけるのは難しいと思いますCOleSafeArray...

_variant_tしたがって、実際には であるメンバー関数 a を介して返されるオブジェクトがありますCOleSafeArray。その要素を読み取り、メモリリークしていないことを確認したい...

これは一種のサンプルコードです。長いと思われる配列の最初の要素を読み取ろうとしています。配列にはさらにデータがあります。

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;
}

このコードに、メモリ リークを引き起こす可能性のある問題はありますか?

4

1 に答える 1

1

コンテンツの効率的な読み取りCOleSafeArrayは、信頼性とパフォーマンスに関するものです。

確実に読み取るには、ジャンクやリークを回避するために、配列自体と要素のタイプを確認する必要があります。この.vtフィールドは、配列のタイプを示します。これは、特定の[固定]タイプの配列、またはVARIANTサブ配列を埋め込む可能性のあるの配列である可能性があります。

を使用して個々の要素を取得するオプションがありますGetElement。この場合、データ要素が文字列、オブジェクト、またはバリアントの場合、関数は要素を正しい方法でコピーするため、コピーをクリアする必要があります。ラッパークラスでそれを行うには、 structCComVariantではなく要素をクラス変数に入れます(クリーンアップします)。VARIANT~CComVariant

または、タイプをチェックしておくと、アレイをロック/ロック解除して、アレイによって管理されている要素に直接アクセスできます。以前のアクセスオプションで要素ごとにロックとコピーを行うのではなく、一度ロックして必要に応じてコピーするため、パフォーマンスのためにこの方法をお勧めします。

~COleSafeArrayデストラクタは配列の要素をクリアするので、それらを明示的に破棄/解放する必要はありません。

于 2012-06-25T16:01:12.803 に答える