【问题标题】:Should I use ReAllocHGlobal or FreeHGlobal/AllocHGlobal?我应该使用 ReAllocHGlobal 还是 FreeHGlobal/AllocHGlobal?
【发布时间】:2009-03-13 05:21:08
【问题描述】:

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

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

【问题讨论】:

    标签: c# memory-management interop


    【解决方案1】:

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

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

    【讨论】:

    • 我认为 Free/Alloc 是一种比 ReAlloc 更简单的模式。我对这些没有任何经验,但由于过去的糟糕经历,我远离 CoTaskMemReAlloc()。虽然我忘记了他们现在的样子。如果您发现自己分配和释放了很多,您可以考虑使用自定义竞技场。
    • 谢谢!在每次操作之前确实需要清除缓冲区。很抱歉没有在我原来的问题中说明这一点。
    • @jeffamaphone 问题是如果你想保留内容,Free/Alloc 实际上是 Alloc/Free,这也保证了副本,而 ReAlloc 只会在它实际上必须重新定位内存时复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2015-10-16
    • 2023-03-06
    • 2013-02-20
    • 2011-07-31
    • 2010-12-23
    相关资源
    最近更新 更多