COM でのメモリ割り当て

メソッドがヒープにメモリ バッファーを割り当て、バッファーのアドレスを呼び出し元に返す場合があります。 COM は、ヒープ上のメモリを割り当てて解放するための関数のペアを定義します。

このパターンの例は、[ 開く] ダイアログ ボックスの例で確認しました。

PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
    // ...
    CoTaskMemFree(pszFilePath);
}

GetDisplayName メソッドは、文字列にメモリを割り当てます。 内部的には、このメソッドは CoTaskMemAlloc を 呼び出して文字列を割り当てます。 メソッドが返されると、 pszFilePath は 新しいバッファーのメモリ位置を指します。 呼び出し元は、 CoTaskMemFree を呼び出してメモリを解放する役割を担います。

COM が独自のメモリ割り当て関数を定義する理由 その理由の 1 つは、ヒープ アロケーターに抽象化レイヤーを提供するためです。 それ以外の場合、一部のメソッドは malloc を呼び出し、他のメソッドは new と呼ばれます。 その後、プログラムは場合によっては 無料 で呼び出して他のプログラムを 削除 する必要があり、すべてを追跡することはすぐに不可能になります。 COM 割り当て関数は、統一されたアプローチを作成します。

もう 1 つの考慮事項は、COM が バイナリ 標準であるため、特定のプログラミング言語に関連付けられていないという事実です。 したがって、COM は言語固有の形式のメモリ割り当てに依存できません。

次へ

COM コーディングのプラクティス