GlobalReAlloc()のハンドルについて – プログラミング – Home

通知
すべてクリア

[解決済] GlobalReAlloc()のハンドルについて


かずや
 かずや
(@かずや)
ゲスト
結合: 15年前
投稿: 6
Topic starter  

クリップボードなどにテキストをコピーする際に、GlobalAlloc()やGlobalReAlloc()を
使用しているのですが、GlobalReAlloc()の使用について疑問があります。
この関数の引数は以下のようになっています。

HGLOBAL GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);

ここで質問なのですが、戻り値がNULL以外の場合には、
引数に指定した「hMem」はGlobalFree(hMem)をコールして解放する必要があるのでしょ
うか?
デバッグしてみると同じハンドル値が戻る場合もあるのですが、このような場合には解
放してはいけないのでしょうか?

現在は以下のようにしているのですが、メモリーリークなどが起きていないか心配で
す。

-------------------------------
HANDLE hNewMem = GlobalReAlloc(hMem, dwLen, GMEM_MOVEABLE | GMEM_ZEROINIT |
GMEM_DDESHARE);

if (hNewMem != NULL) {
if (hNewMem != hMem) {
GlobalFree(hMem);
hMem = hNewMem;
}
}

// 以下でhMemを使用する...

-------------------------------

アドバイスを頂けると嬉しいです。


引用未解決
トピックタグ
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

MSDNのGlobalReAllocの説明に
「GlobalReAlloc が失敗すると、元のメモリは解放されず、元のハンドルとポインタは
依然として有効なままです。」
と有ることから、解放する必要はないように思われます。

http://msdn.microsoft.com/ja-jp/library/cc430130.aspx


返信引用
かずや
 かずや
(@かずや)
ゲスト
結合: 15年前
投稿: 6
Topic starter  

maruさん、レスありがとうございます。

その記述は私も確認済みなのですが、やはり普通に解釈すれば、
「失敗すると引数のハンドルは有効なまま」なので、
「成功した場合には、引数のハンドルは無効になる」
でいいのでしょうかね?

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました