GlobalReAlloc()のハンドルについて

[戻る]
かずや 2009/10/19(月) 11:34:55
クリップボードなどにテキストをコピーする際に、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 2009/10/19(月) 12:19:59
MSDNのGlobalReAllocの説明に
「GlobalReAlloc が失敗すると、元のメモリは解放されず、元のハンドルとポインタは
依然として有効なままです。」
と有ることから、解放する必要はないように思われます。

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

かずや 2009/10/20(火) 08:04:20
[[解決]]
maruさん、レスありがとうございます。

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

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

古いスレッドには追加発言できません。