D:保证销毁

D:保证销毁,d,destructor,D,Destructor,我正在阅读Andrei Alexandrescu的《D编程语言》,并在分解序列中发现了这个金块: …D假定退出应用程序实际上将释放与它相关的所有资源,因此它不会调用任何析构函数 这对内存资源非常有效,但对于网络套接字、自定义硬件、文件句柄等又如何呢。?有没有办法保证我的析构函数总是被调用?或者,D是否提供了更好的处理这些问题的方法(我被困在C++的思维模式中)?< p>可以使用一个在线程终止调用的调用,并且调用(正常)应用程序关闭< /p> (现在,如果我们有弱引用,那么我们就不需要另一个级别的

我正在阅读Andrei Alexandrescu的《D编程语言》,并在分解序列中发现了这个金块:

…D假定退出应用程序实际上将释放与它相关的所有资源,因此它不会调用任何析构函数

这对内存资源非常有效,但对于网络套接字、自定义硬件、文件句柄等又如何呢。?有没有办法保证我的析构函数总是被调用?或者,D是否提供了更好的处理这些问题的方法(我被困在C++的思维模式中)?

< p>可以使用一个在线程终止调用的调用,并且调用(正常)应用程序关闭< /p>
(现在,如果我们有弱引用,那么我们就不需要另一个级别的间接寻址…

其他人提到了模块级析构函数,但这并不实际,因为它需要太多的手动维护,并且D有一个恼人的怪癖,即带有静态构造函数/析构函数的模块不能有循环导入。例如:

模块A

module A;
import B;
static ~this() {}
void main() {}
模块B

module B;
import A;
static ~this() {}
尝试运行…

% dmd A.d B.d
% ./A
Cycle detected between modules with ctors/dtors:
A -> B -> A
object.Exception@src/rt/minfo.d(331): Aborting!
D这样做只是为了防止你们的析构函数碰巧相互依赖,即使它们不依赖。这迫使您对代码进行奇怪的“重构”,以解决这个非问题。没有办法告诉D实际上没有依赖关系

处理资源破坏的一个更好的解决方案是尽可能地扩大范围。没有需要销毁的全局资源,也不要依赖类终结器,因为它们不能保证永远运行(Java也有同样的问题)

或者,只需像C中那样执行操作:手动关机。这是一个多一点的工作,但实际上不是一个大问题。这当然比与周期性进口产品搏斗容易。

  • 终止进程将清除进程内部的所有内容
  • 没有办法阻止操作系统在进程有时间清理进程外部的东西之前杀死进程(如果有,断电甚至会覆盖)

在这两者之间,一切都被覆盖了,所以假设你有权决定事情是如何结束的是毫无意义的