ここから本文です

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

yu_********さん

2018/12/1922:25:25

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

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

閲覧数:
73
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

Marshal.FreeHGlobalで解放する必要があることは、既に質問者さんがよく知っていることです。
質問に、そう書かれているのですから。
C#では、ガベージコレクションがメモリ管理をして、そのガベージコレクションが自動で解放をおこなう。
それなのに、なぜMarshal.AllocHGlobalの場合は、Marshal.FreeHGlobalで解放処理を行う必要があるのか、と言う質問ですよね。
質問に、そう書かれているのですから。



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

質問した人からのコメント

2018/12/26 12:14:45

確かに普通に考えれば当たり前のことでした。
詳細な回答をありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

n2q********さん

2018/12/2007:54:36

ええ、解放されないです。

~理由~

使い終わったのかどうかが分からないためです。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる