0

我分配 IntPtr 指向要与非托管代码一起使用的结构数组。我在这个主题上找到了很多资源,这是我的最终方法(似乎效果很好):

public IntPtr ArrayToPtr<T>(T[] array)
{
    int size = array.Length;
    int elemSize = Marshal.SizeOf(typeof(T));

    IntPtr result = Marshal.AllocHGlobal(elemSize * size);

    for (int i = 0; i < size; i++)
    {
        IntPtr ptr = new IntPtr(result.ToInt64() + elemSize * i);
        Marshal.StructureToPtr(array[i], ptr, false);
    }

    return result;
}

现在我的问题:

  • 如何正确释放这个导致的 IntPtr 指针?(一个 FreeHGlobal(指针)就足够了吗?)
  • 如果我使用 x86 或 x64 系统/应用程序平台,是否需要采取任何预防措施?

字符串数组(C 中的 char**)的相同问题:

public IntPtr ArrayOfStringToPtr(string[] array)
{
    int size = array.Length;
    int elemSize = IntPtr.Size;

    IntPtr result = Marshal.AllocHGlobal(elemSize * size);

    for (int i = 0; i < size; i++)
    {
        IntPtr strPtr = Marshal.StringToHGlobalAnsi(array[i]);
        Marshal.StructureToPtr(strPtr, new IntPtr(result.ToInt64() + elemSize * i), false);
    }

    return result;
}
4

1 回答 1

1

是的,您只需要Marshal.FreeHGlobal(hglobal)在使用完内存后调用。

因为您正在使用IntPtr它将自动在 x86x64 平台上工作,因为它会IntPtr为您处理指针大小的差异。

但是,您不应该使用ToInt64()指针算术。

代替

IntPtr ptr = new IntPtr(result.ToInt64() + elemSize * i);

做这个:

 IntPtr ptr = IntPtr.Add(result, elemSize * i);
于 2013-06-12T08:08:13.560 回答