相互運用マーシャラによるメモリ管理
更新 : 2007 年 11 月
相互運用マーシャラは、アンマネージ コードによって割り当てられたメモリを常に解放しようとします。この動作は 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 のサンプル」を参照してください。