只是为了确保,鉴于我已在该固定数组上固定了字节数组和 GCHandle。
当调用 GCHandle.Free() 方法时,是否只是释放句柄并将原始字节数组的管理权交还给 GC,因此如果有对该数组的活动引用,则不会直接将其处理掉还没有?
你是对的。
GCHandle
只是同一个对象的另一个句柄,只要你至少有一个,你的对象就不会被释放。
但是,您可以将
GCHandle
分配为 Weak
类型,如果您的 GCHandle
是唯一指向它的对象(如果您也有“正常”引用,则不会发生任何坏事) ).
是的。
当句柄超出范围时,您必须通过调用 Free 方法显式释放它;否则可能会出现内存泄漏。当您释放固定句柄时,关联的对象将被取消固定,并且如果没有其他引用,则将有资格进行垃圾回收。
某种程度上,您必须注意
Free()
在 GCHandle 上被调用一次且仅一次。
GCHandle对象代表AppDomain句柄表中的一个条目;如果您以任何方式复制句柄,您将面临双重释放单个条目并损坏句柄表的风险。