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