C#におけるアンマネージド関数(Win32API)呼び出し時におけるメモリの扱い方について教えていただきたいことがございます。
.NET Framework上で呼び出したWin32API関数にて、あるデータを格納したウハンドル(ポインタ)が返り値とします。
例えば、CreateEllipticRgn()はHRGN型のリージョンハンドル(C#上ではIntPtrとして処理)を返してきます。
この場合には返り値のハンドルが指す番地には実体(リージョンデータ)があるはずです。
#そもそもこの時点で間違っていたらご指摘下さい(^^;
アプリケーション終了時にGCにてCreateEllipticRgn()にて確保された返り値のハンドル先の領域は解放されるのでしょうか?
例としてCreateEllipticRgn()を挙げましたが、一般的な話としてアンマネージド関数内で確保された領域の扱いについてご指摘いただけると有り難いです。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
マネージド ( managed:管理されている ) とかアンマネージド ( unmanaged:管理されていない ) とかって、.NET Framework の中核である Common Language Runtime ( CLR ) によって管理されているか、いないか、を指しています。
アンマネージドコードによって確保されたメモリ(アンマネージドメモリ)は CLR によって管理されていない(というか、できない)ので、GC によるメモリ解放もされません。
アプリケーション終了時には、OS によって、そのアプリケーションが使用していたメモリは解放されますので、アンマネージドメモリが解放されずに残っていても、アプリケーション終了時には解放されます。
しかし、アンマネージドメモリを解放しないままアプリケーションを動かしていると、アプリケーションが起動している間はメモリがどんどん消費されてメモリがひっ迫する可能性が出てくるので、アンマネージドメモリは不要になった時点で解放すべきでしょう。
解放の方法は、確保された方法によっていろいろです。
例えば、
HRGN などの GDI オブジェクト:DeleteObject を使用
HANDLE 型の Kernel オブジェクト:CloesHandle を使用 ( FindFirstFile の場合は FindClose )
GlobalAlloc で確保されたメモリ:GlobalFree を使用
となっています。( FindFirstFile のように、他にも例外があるかも)
>この場合には返り値のハンドルが指す番地には実体(リージョンデータ)があるはずです。
現状では正しいと思いますが、仕様としては保証されていないと思います。
丁寧なご回答を有難う御座いました。
やはり明示的に解放しなければならないのですね。
C#上からでしかWin32APIを触ったことがなくて、ハンドルから実体の解放方法が分からなかったのですが、これについても勉強になりました。
大変助かりました。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
- Visual Basic(VBA) エクセル 2つの列にある値の完全一致を抜き出すVBA 15 2022/12/15 03:22
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ヒープメモリの解放について
-
メモリ不足になってしまう。
-
win32APIのHeapAlloc()の使い方...
-
new、memset()、エラー
-
allocってなんですか?
-
C言語に関する質問
-
GDI+におけるメモリの開放について
-
64ビットと32ビットの違い
-
C++のnewで確保したメモリーの...
-
HEAP に関すること
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
指定したメモリアドレスの値の...
-
C++ Vectorのデストラクタ
-
スタック破壊の上手な見つけ方...
-
LPWSTRのコピー
-
malloc()関数内でセングメント...
-
グローバル変数のサイズ
-
newでrealloc?
-
入れ子になった構造体について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報