.NETのIntptr構造体に関する質問です。


.NETのIntptr構造体に関する質問です。

C#でポインタを利用する際、Marshal.AllocHGlobalでメモリ領域を確保しMarshal.FreeHGlobalで確保した領域を解放しますが、Marshal.AllocHGlobalで確保された領域はガベージコレクションで自動的に解放されないのですか？




解放されません。  
<https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.interopservices.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` する必要があります。




解放されません。  
<https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.interopservices.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` する必要があります。

