问题标签 [finalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
505 浏览

.net - 如果发现 FReachable 对象是可访问的,会发生什么情况?

如果假设一个对象实现了 Finalize 方法,但它内部引用了应用程序的一个活动的静态对象(糟糕的设计!但很有可能)。

现在,当 GC 启动并通过将对象放入终结队列中来终结对象,然后将其移动到 FReachable 队列中,它将调用其 finalize 方法。

但是哇!它发现它引用了一个活动对象,因此它不允许 GC 回收该对象占用的内存并再次标记该对象为活动对象。僵尸对象!

此时这个对象驻留在哪里?

  1. 仍然处于脆弱状态?
  2. 留在完成队列中?
  3. 以不确定的状态保留在托管堆上(从易碎队列和终结队列中删除)?

另外,对于此类对象, ReRegisterForFinalize() 的最佳位置是什么?

0 投票
1 回答
2756 浏览

delphi - 在 OleVariant 后面释放接口的正确方法是什么?

我正在尝试找到一种安全/确定的方式来释放封装在 OleVariant 中的接口。

AFAICS Delphi 在程序结束时释放接口引用,但在我的情况下,我必须提前这样做,因为我必须关闭 COM。

我想把 OleVariant 放在一个额外的类实例中,我可以在调用之前释放它CoUninitialize

这个解决方案是安全的还是我忽略了更好的解决方案?

0 投票
1 回答
514 浏览

c# - C# try-finally CER 会在迭代器中中断吗?

显然,受约束的执行区域保证不适用于迭代器(可能是因为它们是如何实现的),但这是一个错误还是设计使然?[见下面的例子。]

即与迭代器一起使用的 CER 的规则是什么?

(代码大多是从这里偷来的。)

0 投票
2 回答
1601 浏览

delphi - 为什么在关闭时不执行包的任何单元完成部分中的代码?

我有一个使用静态链接运行时包以及使用它们的设计时包的应用程序。出于某种原因,任何单元完成部分中的代码都没有在运行时运行(我不知道这是什么时候开始发生的)。

关闭 Delphi 会显示该消息,但不会在我的应用程序关闭时显示。更奇怪的是,如果我在 ShowMessage 上放置一个断点,它会在那里中断但不执行该行。如果终结中有多行,则调试器在第一行停止,不执行它然后跳转到最后。

ProcOne 断点上的调用堆栈显示 @Halt0 => FinalizeUnits => MyPackage.MyUnit.Finalization。

如果我在不使用包的应用程序中包含该单元,则一切都会正确执行。

有谁知道可能导致这种情况的原因是什么?

编辑:

感谢 Allen Bauer 指出正确方向的评论,我已经设法隔离了这个问题。如果应用程序是使用运行时包构建的,然后动态加载另一个也引用该包和单元的包,似乎就会出现问题。

我创建了一个演示问题的测试项目:TestFinalization

有谁知道这个和/或解决方法的原因?您通常可能不会注意到您的最终确定没有运行,直到您注意到外部资源没有被清理。

0 投票
2 回答
1331 浏览

sql - 如果报告 SQLite 数据库损坏 SQLITE_CORRUPT,我是否应该完成我的陈述

我收到数据库损坏的 SQLITE_CORRUPT 错误。

在我的代码中,我有一个 try/finally 子句,在该子句中我总是尝试使用 sqlite3_finalize 我的语句。

显然,在尝试完成语句的损坏数据库上再次引发 SQLITE_CORRUPT。

问题:如果报告数据库已损坏,我应该完成我的陈述吗?

0 投票
15 回答
4606 浏览

c# - “Dispose”是否应该只用于包含非托管资源的类型?

我最近和一位同事讨论了Dispose实现IDisposable.

我认为实现IDisposable应该尽快清理的类型是有价值的,即使没有要清理的非托管资源

我的同事想法不同;IDisposable如果您没有任何非托管资源,则无需实施,因为您的类型最终将被垃圾收集。

我的论点是,如果您有一个想要尽快关闭的 ADO.NET 连接,那么实施IDisposableusing new MyThingWithAConnection()有意义。我的同事回答说,在幕后,ADO.NET 连接是非托管资源。我对他的答复是,一切最终都是非托管资源

我知道推荐的一次性模式,如果被调用,则释放托管和非托管资源,Dispose如果通过终结器/析构函数调用,则仅释放非托管资源(并在不久前发表了关于如何提醒消费者不当使用 IDisposable 类型的博客)

所以,我的问题是,如果你有一个不包含非托管资源的类型,是否值得实现IDisposable

0 投票
1 回答
633 浏览

delphi - 如何确保某个“最终确定”部分是最后一个执行的部分?

我的 Delphi 7 项目中有许多带有“定稿”部分的单元。

如何确保最后执行一些代码?

我试图在 .dpr 文件中写一个“最终化”部分,但它没有编译。

0 投票
3 回答
15767 浏览

delphi - 我需要在 Delphi 中完成记录数组吗?

在我的申请中,我有以下记录:

我在这个数组中使用这个记录:

我在运行时保持数组加载,但在给定时间我需要清除所有数据并添加一些新数据。

仅使用以下内容是否足够:

还是我需要完成一些事情?

0 投票
2 回答
519 浏览

delphi - 我可以保证在表单销毁后执行自定义终结代码吗?

我有一个包含许多表单的多线程应用程序,但我必须在创建表单之前实例化一些类并调用一些初始化的东西。当然我必须执行相应的终结代码。

这是 .dpr 文件的简化示例:

这里的问题是块内的代码在我的表单的/ sfinally之前执行。看看单元的部分就很清楚了:OnDestroydestructorfinalizationForm

DoneApplication调用Application.DestroyComponents有效地释放了所有Application拥有的表单。

因此,使用创建的表单Application.CreateForm将在主begin..end块内的任何代码之后被销毁。

我想要的是在Application.Run所有表单都被销毁之后,以便它们的OnDestroy事件处理程序可以看到Config我的 dll 中定义的对象和外部函数。如果引发异常,则同上。但我也希望有标准应用程序的异常处理 ifConfig.FreeUnlodDllsraise (应用程序必须仍然存在)。

注意:

  • 我不想使用finalization块(在 .dpr 中是否可能?)以保持代码更清晰和可调试;
  • 目前,我不希望更改太多代码(例如动态创建表单)

我认为最简单的解决方案是显式调用Application.DestroyComponentsafter Application.Run。你觉得有什么缺点吗?有没有更优雅的解决方案?

谢谢

0 投票
1 回答
283 浏览

c# - 在 C# 中,一个类如何以在 ASP.Net 和非 Web 应用程序下工作的方式完成自己的应用程序端终结?

我有一个在 ASP.Net 和非 Web 应用程序中使用的库类,需要应用程序结束完成。

在我的项目库中,我希望该类执行它自己的应用程序结束完成,而不需要开发人员添加对 Global.Application_End 或 AppDomain.CurrentDomain.ProcessExit 的调用。

如何才能做到这一点?

其他背景/理由:

即使我要考虑这些选项,当 ASP .Net 应用程序在 IIS 中停止时,AppDomain.CurrentDomain.ProcessExit 似乎也不会被调用。Global.Application_End 特定于 ASP .Net。因此,这两种选择都不兼容这两种情况。

如果它有助于有一个具体的例子来说明为什么需要这样做......在这种特殊情况下,它使用 SqlDependency (据我了解)需要调用 SqlDependency.Start 进行初始化并调用 SqlDependency.Stop 在应用程序之前终止。

(见http://msdn.microsoft.com/en-us/library/ms172133.aspx