クリップボードなどにテキストをコピーする際に、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を使用する...
-------------------------------
アドバイスを頂けると嬉しいです。
MSDNのGlobalReAllocの説明に
「GlobalReAlloc が失敗すると、元のメモリは解放されず、元のハンドルとポインタは
依然として有効なままです。」
と有ることから、解放する必要はないように思われます。
http://msdn.microsoft.com/ja-jp/library/cc430130.aspx
maruさん、レスありがとうございます。
その記述は私も確認済みなのですが、やはり普通に解釈すれば、
「失敗すると引数のハンドルは有効なまま」なので、
「成功した場合には、引数のハンドルは無効になる」
でいいのでしょうかね?
ありがとうございました。