如何在C#中固定Marshal.AllocHGlobal()分配的内存?

时间:2016-11-11 00:18:53

标签: c# .net garbage-collection pinvoke marshalling

如何固定Marshal.AllocHGlobal()分配的内存?

我的第一次尝试如下:

int bytes = 10;
IntPtr ip = Marshal.AllocHGlobal(bytes);
GCHandle iph = GCHandle.Alloc(ip, GCHandleType.Pinned);

虽然我认为这只会固定IntPtr,而不是IntPtr引用的内存块。

1 个答案:

答案 0 :(得分:6)

AllocHGlobal分配的内存已固定。返回的IntPtr是固定位置的地址。

更新:要迂腐,你实际上不能“固定”AllocHGlobal分配的内存,固定东西意味着告诉垃圾收集器不要将对象移动到内存中。由AllocHGlobal分配的内存是“非托管内存”,这意味着它是不由垃圾收集器管理的内存。

除了垃圾收集器之外,没有任何进程会在程序中移动内存,垃圾收集器也不关心非托管资源。