2009-03-13 22 views
1

私が接続しているレガシーデータベースは、データバッファを使用してアプリケーションに行を渡します。これをC#で処理するために、バッファに異なる型を読み書きするためのメソッドを提供するクラスを作成しました。各データファイルは1つのデータバッファを使用しますが、特定の操作のためにバッファのサイズを変更する必要があります。これを行うために、私はメソッドを割り当て、コメントを追加しました:私はしかし、ReAllocHGlobalを気づい前だったReAllocHGlobalまたはFreeHGlobal/AllocHGlobalを使用すべきですか?

public void Allocate(int bytes) { 
    if (handle != IntPtr.Zero) { // memory has already been allocated 
     Marshal.FreeHGlobal(handle); 
    } 
    handle = Marshal.AllocHGlobal(bytes); 
} 

。私はこれを行う必要がある場合は今、私は思ったんだけど:

public void Allocate(int bytes) { 
    if (handle != IntPtr.Zero) { // memory has already been allocated 
     handle = Marshal.ReAllocHGlobal(handle, (IntPtr)bytes); 
    } else { // this is a brand new data buffer 
     handle = Marshal.AllocHGlobal(bytes); 
    } 
} 

私は最初の方法はクリーンに見えますが、使用するのが最善であると思いますか?私の最初の考えは、ReAllocHGlobalが(それは特に既存のメモリブロックのサイズを変更するための)意味がありますが、100%確実ではありません。

答えて

3

バッファに情報を保持する必要がない場合は、新しいバッファを解放して割り当てる方が適切です。 ReAllocがバッファを別の場所に割り当てる必要がある場合、既存の内容がコピーされます。

一方、バッファの内容を保持して拡張(または縮小)したい場合は、ReAllocを使用する方が簡単です。

+0

私はFree/AllocがReAllocを使うより簡単なパターンだと思います。私はこれらの経験がありませんでしたが、過去の悪い経験のためにCoTaskMemReAlloc()から離れています。彼らは今何だったのか忘れていますが。あなたが自分自身を割り当てて解放していることが分かったら、カスタムアリーナの使用を検討することができます。 –

+0

ありがとうございました!各操作の前にバッファーをクリアする必要があります。私の元の質問でそれを述べて申し訳ありません。 –

+0

@jeffamaphone ReAllocは実際にメモリを再配置する必要がある場合にのみコピーするのに対し、Free/Allocは実際にはAlloc/Freeで内容を保持してコピーを保証したい場合は問題ありません。 – Zooba

関連する問題