質問: .NETのIntptr構造体に関する質問です。 C#でポインタを利用する際、Marshal.AllocHGlobalでメモリ領域を確保しMarshal.FreeHGlobalで確保した領域を解放しますが、Marshal.AllocHGlobalで確保された領域はガベージコレクションで自動的に解放されないのですか?
回答: 解放されません。 解説を読むうえで重要なキーワードは「マネージ」「アンマネージ」で、 * マネージ .NET Framework の管理下にあって、オブジェクトが自動 gc されるもの。 [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") や [visualbasic](/questions/tagged/visualbasic "'visualbasic' のタグが付いた質問を表示") で `new` するとこっち。マネージメモリを Visual C/C++ native DLL に直接渡すことはできない。 * アンマネージ .NET Framework の管理下にないもの。端的には Win32 Native なコードやメモリのこと。つまり Visual C/C++ で書いたコードや、直接使えるメモリのこと。アンマネージのほうが歴史的に古い存在なので、マネージコードからアンマネージコードを呼び出す際に「マーシャリング」することで、間接的にマネージコードからアンマネージメモリを使うことはできるようになっている(マーシャラの性能が高いかと問われると微妙かも) この件、マニュアルにきっちり「アンマネージ」と明記されていますので gc 対象にはならないと読めます。すなわち、自分で `Marshal.FreeHGlobal` する必要があります。