1

在不安全的环境中,我知道通过使用该fixed语句,我可以获得并固定变量的地址,以便我可以安全地使用获取的指针。但是,有什么方法可以安全地将这个指针存储在某个地方?如,使该变量永久固定,直到指针本身被释放。

例如,如果我希望一个指向integer//的指针成为我的 unsafe 类的成员,我float应该怎么做?double

4

1 回答 1

11

固定内存的更永久解决方案是使用GCHandle类,如下所示:

var handle = GCHandle.Create(myObject, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
//... use it
handle.Free();

这允许您检索固定对象的地址并防止 GC 移动它。但是,一旦完成,您必须保持GCHandle生命并释放它。这比使用块更容易跨越许多方法甚至类fixed()

值得注意的是,固定记忆可能会损害你的表现,因为你让GCs 更加努力地工作。

如果您需要一块永远不会移动的内存,因为您正在使用它与本机代码等进行交互操作,您可能会考虑使用Marshal.AllocHGlobal()andMarshal.FreeHGlobal()以便分配不会干扰的不可移动内存GC

于 2013-03-04T12:00:35.177 回答