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;
}
THX。那么字符串数组呢? –
字符串阵列使用从'AllocHGlobal()'这是从称为'StringToHGlobalAnsi()'所以同样适用存储器 - 只是调用'FreeHGlobal()'上的IntPtr从'StringToHGlobalAnsi返回()'以释放存储器。还要记得使用'IntPtr.Add()'来为字符串例子做指针运算。 –
你的意思我只需要释放strPtr而不是结果终场前FreeHGlobal? –