我想固定一个通用类型的数组并获得一个指向其内存的指针:
T[] arr = ...;
fixed (T* ptr = arr)
{
// Use ptr here.
}
但是尝试编译上面的代码会产生这个编译错误:
Cannot take the address of, get the size of, or declare a pointer to a managed type
these questions的答案确认无法声明通用T*
指针。但有没有办法固定通用T[]
数组并获得固定内存的IntPtr
? (这样的指针仍然有用,因为它可以传递给本机代码或转换为已知类型的指针。)
答案 0 :(得分:7)
是的,您可以使用GCHandle
对象固定通用T[]
数组并在固定时获取IntPtr到其内存:
T[] arr = ...;
GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
// Use the ptr.
handle.Free();
请务必记住调用Free()
,否则数组永远不会被取消固定。