在不安全的环境中,我知道通过使用fixed
语句,我可以获取并固定变量的地址,以便我可以安全地使用获取的指针。但是,有没有办法将此指针安全地存储在某处?如同,使该变量永久固定,直到指针本身被处理。
例如,如果我想要指向integer
/ float
/ double
的指针成为我的不安全类的成员,该怎么办?
答案 0 :(得分:10)
固定内存的更永久的解决方案是使用GCHandle
类,如下所示:
var handle = GCHandle.Create(myObject, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
//... use it
handle.Free();
这允许您检索固定对象的地址并防止GC移动它。但是,您必须保持GCHandle
活着,并在完成后将其释放。使用fixed()
块更容易跨越许多方法甚至类。
值得注意的是,固定内存可能会损害您的性能,因为您正在使GC
更加努力。
如果您需要一块永远不会被移动的内存块,因为您正在使用它来与本机代码等进行交互操作,您可以考虑使用Marshal.AllocHGlobal()
和Marshal.FreeHGlobal()
以便分配非可移动的内存,不会干扰GC
。