相互運用マーシャラーによるメモリ管理

相互運用マーシャラーは、アンマネージ コードによって割り当てられたメモリを常に解放しようとします。 この動作は COM のメモリ管理の規則に準拠していますが、ネイティブ C++ の規則とは異なります。

プラットフォーム呼び出しを使用する場合は、自動的にポインターのメモリが解放されるので、メモリを解放しないネイティブ C++ の動作を期待すると、混乱が生じる可能性があります。 たとえば、C++ の DLL から次のアンマネージ メソッドを呼び出しても、メモリは自動的には解放されません。

アンマネージ シグネチャ

BSTR MethodOne (BSTR b) {
     return b;
}

このメソッドをプラットフォーム呼び出しプロトタイプとして定義し、各 BSTR 型を String 型に置換して、MethodOne を呼び出す場合、共通言語ランタイムは b を 2 回解放しようとします。 このマーシャリング動作を変更するには、String 型の代わりに IntPtr 型を使用します。

ランタイムは常に CoTaskMemFree メソッドを使用してメモリを解放します。 操作の対象であるメモリが CoTaskMemAlloc メソッドで割り当てられていない場合は、IntPtr を使用し、適切なメソッドを使って手動でメモリを解放する必要があります。 同様に、メモリを解放するべきではない場合に、自動的なメモリの解放を回避することもできます。たとえば、Kernel32.dll から、カーネル メモリへのポインターを返す GetCommandLine 関数を使用するような場合です。 手動によるメモリの解放の詳細については、「Buffers のサンプル」を参照してください。

参照

概念

方向属性

Blittable 型と非 Blittable 型

コピーと固定

その他の技術情報

既定のマーシャリングの動作