私が接続しているレガシーデータベースは、データバッファを使用してアプリケーションに行を渡します。これを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%確実ではありません。
私はFree/AllocがReAllocを使うより簡単なパターンだと思います。私はこれらの経験がありませんでしたが、過去の悪い経験のためにCoTaskMemReAlloc()から離れています。彼らは今何だったのか忘れていますが。あなたが自分自身を割り当てて解放していることが分かったら、カスタムアリーナの使用を検討することができます。 –
ありがとうございました!各操作の前にバッファーをクリアする必要があります。私の元の質問でそれを述べて申し訳ありません。 –
@jeffamaphone ReAllocは実際にメモリを再配置する必要がある場合にのみコピーするのに対し、Free/Allocは実際にはAlloc/Freeで内容を保持してコピーを保証したい場合は問題ありません。 – Zooba