#unity/日常积累
GCHandle.Alloc 是 C# 中的一个方法,它用于在垃圾回收(GC)堆上分配一个句柄,该句柄指向一个对象。这个句柄可以用来固定对象在内存中的位置,防止垃圾回收器移动它,这在某些需要对象地址保持不变的场景下非常有用,比如与非托管代码的互操作。
使用 GCHandle.Alloc 方法时,你需要传递一个对象作为参数,并且可以选择性地指定一个 GCHandleType 枚举值来指示句柄的类型。分配句柄后,你可以使用返回的 GCHandle 实例来访问和操作对象。
重要的是要记住,在使用完 GCHandle 后,你应该调用其 Free 方法来释放它,否则可能会导致内存泄漏。
下面是一个简单的示例,展示了如何使用 GCHandle.Alloc 方法:
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]]