GCHandle.Free() 只是释放句柄吗?

问题描述 投票:0回答:3

只是为了确保,鉴于我已在该固定数组上固定了字节数组和 GCHandle。

当调用 GCHandle.Free() 方法时,是否只是释放句柄并将原始字节数组的管理权交还给 GC,因此如果有对该数组的活动引用,则不会直接将其处理掉还没有?

c# .net garbage-collection
3个回答
7
投票

你是对的。

GCHandle
只是同一个对象的另一个句柄,只要你至少有一个,你的对象就不会被释放。

但是,您可以将

GCHandle
分配为
Weak
类型,如果您的
GCHandle
是唯一指向它的对象(如果您也有“正常”引用,则不会发生任何坏事) ).


4
投票

是的。

当句柄超出范围时,您必须通过调用 Free 方法显式释放它;否则可能会出现内存泄漏。当您释放固定句柄时,关联的对象将被取消固定,并且如果没有其他引用,则将有资格进行垃圾回收。

-- http://msdn.microsoft.com/en-us/library/khk3k17t.aspx


0
投票

某种程度上,您必须注意

Free()
在 GCHandle 上被调用一次且仅一次。

GCHandle对象代表AppDomain句柄表中的一个条目;如果您以任何方式复制句柄,您将面临双重释放单个条目并损坏句柄表的风险。

GCHandles 的真相

© www.soinside.com 2019 - 2024. All rights reserved.