#unity/日常积累 `GCHandle.Alloc` 是 C# 中的一个方法,它用于在垃圾回收(GC)堆上分配一个句柄,该句柄指向一个对象。这个句柄可以用来固定对象在内存中的位置,防止垃圾回收器移动它,这在某些需要对象地址保持不变的场景下非常有用,比如与非托管代码的互操作。 使用 `GCHandle.Alloc` 方法时,你需要传递一个对象作为参数,并且可以选择性地指定一个 `GCHandleType` 枚举值来指示句柄的类型。分配句柄后,你可以使用返回的 `GCHandle` 实例来访问和操作对象。 重要的是要记住,在使用完 `GCHandle` 后,你应该调用其 `Free` 方法来释放它,否则可能会导致内存泄漏。 下面是一个简单的示例,展示了如何使用 `GCHandle.Alloc` 方法: ``` cs class Program { static void Main() { object obj = new object(); GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned); try { // 在这里,你可以使用 handle 来访问和操作 obj // 例如,你可以将 handle.AddrOfPinnedObject() 传递给需要对象指针的非托管代码 } finally { // 确保在使用完 handle 后释放它 handle.Free(); } } } ``` 在这个示例中,我们创建了一个 `object` 实例,并使用 `GCHandle.Alloc` 方法分配了一个固定(pinned)句柄。然后,在 `try` 块中,我们可以使用这个句柄来访问和操作对象。最后,在 `finally` 块中,我们确保释放了句柄,以避免内存泄漏。 其中一个用法,是跨语言和平台交互,例如要把一个方法,传递给objectc,可以配合[[GCHandle.ToIntPtr]]使用 ![[Pasted image 20241025144012.png]]