- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
------------编辑1------------
对不起,我的英语不好,似乎原来的问题对很多人来说都没有意义,所以我把问题大大简化为两句话:
在 IDisposable pattern in MSDN 的 msdn 代码示例中, 将释放非托管资源代码放在析构函数中是为了当用户忘记调用Dispose()
释放资源时,GC 仍然可以帮助释放至少非托管资源,但是,当一个类使用一些非托管资源时,它必须(隐式或显式)将当前实例(或字段)注册到 GC 句柄表,然后永远不会被 GC,那么在这种情况下如何执行析构函数中的代码?
------------结束Edit1--------
我们知道著名的 IDisposable
模式,它可以在网络上看到很多,例如:IDisposable pattern in MSDN
在示例中,据我了解,析构函数的目的适用于这种情况:如果用户忘记显式调用 Dispose()
,则 GC 将提供帮助 并释放未-托管资源。
但我只是想知道,在任何情况下,GC 都可以调用析构函数而无需用户代码先显式调用Dispose()
?
猜测是基于实现 IDisposable
的原因,并且有一个显式析构函数:
此类使用了一些非托管资源。无论是通过 P/Invoke 还是托管 API (BCL),据我所知,这两种方式都需要向 GC 句柄表添加一个GC 句柄条目,以避免 GC,因此析构函数永远不会被 GC 调用。
所以我们永远不应该指望资源自动释放的运气?为什么要将其放入示例代码中?
最佳答案
这里有很多问题。让我们试着回答所有这些问题。
In the MSDN code sample of the
IDisposable
pattern code to release unmanaged resources is put in the destructor. This ensure that when a user forgots to callDispose()
to release the resource, the GC still releases the unmanaged resources.
正确。
But when a class uses some unmanaged resources, it must have registered the current instance to GC handle table and then would never be GCed.
这句话我没看懂。您所说的“GC 句柄表”是什么?
您能否展示一些示例代码来演示您的场景?
How does the code in destructor get executed in this situation?
简而言之,GC 是这样工作的。 GC 知道“根”;这些绝对是活生生的引用资料。 GC 首先将所有对象标记为已死亡。然后它将根标记为活着。然后它将根标记为事件的所有内容,然后它们 标记为事件的所有内容,依此类推。那就是从根可以到达的一切都是活的。然后 GC 杀死所有仍然标记为死的东西。
现在,如果死对象是可终结的——如果它有一个尚未运行的析构函数——那么 GC 不会杀死该对象。对象被放到一个要终结的对象列表中,这个列表是一个根,所以对象又活了。稍后,另一个线程运行终结队列中每个对象的析构函数,并将它们从队列中移除,并将它们标记为不再需要终结。
下次 GC 运行时,如果对象仍然是死的,那么它会被收集并且终结器不会再次运行。
Can the destructor get called by the GC without user code explicitly call
Dispose()
first?
是的。这就是析构函数的重点。
关于c# - 是否有可能在实现 IDisposable 的类的析构函数中调用 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20463390/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!