我应该使用ReAllocHGlobal还是FreeHGlobal / AllocHGlobal?

时间:2009-03-13 05:21:09

标签: c# memory-management interop

我正在连接的旧数据库使用数据缓冲区将行传递给应用程序。为了在C#中处理这个问题,我写了一个类,它提供了在缓冲区中读写不同类型的方法。每个数据文件使用一个数据缓冲区,但必须为某些操作调整缓冲区的大小。为此,我添加了分配方法:

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

然而,在我注意到 ReAllocHGlobal 之前。现在我想知道我是否应该这样做:

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%肯定。

1 个答案:

答案 0 :(得分:4)

如果您不需要在缓冲区中保留信息,则释放和分配新缓冲区是更好的选择。如果ReAlloc需要在不同的位置分配缓冲区,它将复制现有内容。

另一方面,如果你想保留缓冲区的内容并扩展(或缩小)它,ReAlloc是更简单的方法。