我在C#中有一个类,我希望在我的类被处理时正确关闭一些通信端口。然而,当我退出程序时,终结器(finalizer)从未被调用。我做错了什么吗? 我手动调用dispose以关闭所有通信,但这也没有触发。 这是我使用的终结器:~Power() { Dispose(false); }
终结器总是被 .net framework 调用,所以顺序可能会失控;即使构造函数失败,析构函数仍然可以被触发。 当这样的终结器异常来自第三方库时,可能会带来麻烦:我找不到处理它们的方法! 例如,在下面的代码中,尽管 A 类的构造函数始终抛出异常并失败,但 A 的终结器将被 .net fr...
class Program : CriticalFinalizerObject { static void Main(string[] args) { Program p = new Program(); ...
我注意到 System.Threading.Thread 类实现了一个 finalizer(终结器),但没有实现 IDisposable 接口。推荐的做法是当实现 finalizer 时,总是应该同时实现 IDisposable 接口。Jeffrey Richter 写道,这个指导方针 "非常...
我正在使用一个搜索库,建议保持搜索句柄对象的打开状态,这可以使查询缓存受益。随着时间的推移,我观察到缓存往往会变得臃肿(几百兆并且不断增长),并且OOM开始发挥作用。没有办法强制限制此缓存的大小或计划它可以使用多少内存。因此,我增加了限制,但这只是问题的临时解决方案。 最终,我考虑将此对象作...
我有一个WindowsForms应用程序,似乎存在内存泄漏问题,因此我使用Redgate的ANTS内存分析器查看我怀疑的对象,并发现它们只被已经在终结器队列(Finalizer Queue)中的对象所引用。非常好,那么什么是终结器队列?您能指出最好的定义吗?您能分享一些趣闻轶事吗? 此外,终...
我知道当对象被销毁时无法控制发生的事情是有设计意图的。我也知道定义一些类方法作为终结器。然而,Ruby中的惯用语是C++的RAII(资源在构造函数中初始化,在析构函数中关闭)吗?人们如何管理对象内部使用的资源,即使发生错误或异常?使用ensure可以解决:f = File.open("test...
函数runtime.SetFinalizer(x, f interface{})设置与x关联的终结器为f。 默认情况下,哪些对象会被终结器终结? 默认情况下终结对象可能会导致哪些意外问题?
.NET有一个名为GC.KeepAlive(Object)的函数,其唯一目的是确保引用对象的生命周期持续到代码流达到调用的位置。 一般情况下,除非与本机代码进行交互,否则通常不需要这样做。 我有一个情况,其中通过JNI访问的C++对象图,其中某些根对象需要保持活动状态以使子对象保持活动状态...
我一直认为答案是否定的,但我找不到任何说明。在我的类中,我能否在终结器(即ReleaseUnmanaged())中访问实例C的托管字段/属性?如果有限制,那是什么?GC或终结器会将这些成员设置为空吗?我唯一能找到的是终结器队列中的内容可以以任何顺序进行终结。所以,在这种情况下,既然建议是类型应...