質問: .NETのIntptr構造体に関する質問です。
回答: Marshal.FreeHGlobalで解放する必要があることは、既に質問者さんがよく知っていることです。 質問に、そう書かれているのですから。 C#では、ガベージコレクションがメモリ管理をして、そのガベージコレクションが自動で解放をおこなう。 それなのに、なぜMarshal.AllocHGlobalの場合は、Marshal.FreeHGlobalで解放処理を行う必要があるのか、と言う質問ですよね。 質問に、そう書かれているのですから。 [解放処理のコードを記述する理由] C#とC++/CLIでは、マネージコード(C#等の.NET系のコード)とアンマネージコード(C言語的なコード)の共存が可能です。 ただし、アンマネージコードが使っているメモリ領域を、ガベージコレクションが勝手に上書きして使ってしまいます。 もちろん、実行時に大きなトラブルになります。 よって、アンマネージコードを記述する際は、ガベージコレクションが関わらないメモリ領域を確保します。 それが、Marshal.AllocHGlobalです。 ガベージコレクションが関わらないのですから、当然、解放処理のコードを記述する必要があります。 Marshal.AllocHGlobalだけに限らず、Marshalクラスには、解放処理を記述する必用のある機能が、幾つか存在します。 これらは、上記説明と同じ理由で、解放処理を記述する必用があります。