2013-06-12 93 views
0

我分配IntPtr指向要用于非托管代码的结构数组。我发现在这个问题上很多的资源,这里是我的最后一个方法(似乎运作良好):如何正确释放指向非托管数组的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; 
} 

回答

1

是的,你只需要调用Marshal.FreeHGlobal(hglobal)一旦你已经使用的内存完成。

由于您使用的IntPtr因为IntPtr照顾中差指针大小为你它会自动在x86工作 x64平台。

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

而不是

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

这样做:

IntPtr ptr = IntPtr.Add(result, elemSize * i); 
+0

THX。那么字符串数组呢? –

+0

字符串阵列使用从'AllocHGlobal()'这是从称为'StringToHGlobalAnsi()'所以同样适用存储器 - 只是调用'FreeHGlobal()'上的IntPtr从'StringToHGlobalAnsi返回()'以释放存储器。还要记得使用'IntPtr.Add()'来为字符串例子做指针运算。 –

+0

你的意思我只需要释放strPtr而不是结果终场前FreeHGlobal? –

相关问题