问题标签 [destructor]

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 投票
4 回答
4573 浏览

c++ - C++ 构造函数和析构函数

编译程序时出现一些错误。它们与我的类指令的构造函数和析构函数有关。

错误是:

这是我的代码:

///////////////////////////////////////// //////////////////

0 投票
9 回答
5147 浏览

c++ - 是否总是为删除运算符调用析构函数,即使它被重载?

我正在将一些旧代码从 C 移植到 C++。旧代码使用类似对象的语义,并且在某一时刻将对象销毁与释放现在未使用的内存分开,两者之间发生了一些事情:

在 C++ 中使用标准析构函数 ( ~Object) 和随后的调用是否可以实现上述功能delete obj?或者,正如我担心的那样,这样做会调用析构函数两次?

在特定情况下,operator deleteofObject也会被覆盖。我在其他地方读到的定义(“当使用运算符删除,并且对象有一个析构函数时,总是调用析构函数)在重写运算符的情况下是否正确?

0 投票
5 回答
698 浏览

c# - 由于 ASP.NET-Page (C#) 导致服务器崩溃

一旦我尝试写入日志文件,我的本地测试服务器就会崩溃。我将它用于 ASP.NET 页面,代码隐藏是 C#。

结构:

我创建了一个实例Functions作为我的index.aspx负载。在Functions中,我定义了一个用于记录的函数,它被调用index.aspx.cs并看起来像这样:

_Writer为 Class 全局定义,如您所见,它包含一个 StreamWriter。类本身有一个析构函数来关闭与文件的任何连接;

因此,当我打开页面时,会写入日志,但随后服务器崩溃。所以我认为问题出在描述符的某个地方,但我不知道为什么......

0 投票
4 回答
12344 浏览

c# - 为什么静态类不能有析构函数?

两个部分:

  1. 如果静态类可以有静态构造函数,为什么不能有静态析构函数?

  2. 最好的解决方法是什么?我有一个静态类来管理作为 COM 对象的连接池,如果程序中的其他地方发生故障,我需要确保它们的连接被关闭/释放。

0 投票
6 回答
446 浏览

c# - 为什么我的析构函数被调用?

我有一些类通过 IDictionary 实例成员保存对其他类的引用。

像这样:

所以这就是设置,我从不从这本字典中删除它们,但由于某种原因,B 类的析构函数不时在 GC 运行时被调用,我不明白为什么。

这可能与 Dictionary 类如何添加新引用有关吗?

固定

好的,谢谢大家的回答,我现在对GC和解构器当然有了很大的了解。

但问题是我自己的,我只在它不存在的情况下添加someInt并且通过有缺陷的业务逻辑, someInt始终为 1,所以第一次通过它工作并且解构器没有被调用。但是第二次,“b”实例根本没有添加到列表中,而是在 GC 运行中被清理了。

再次感谢所有提供帮助的人!

0 投票
4 回答
3678 浏览

c++ - C++ 破坏表达式中的临时对象

给定以下代码:

我得到以下输出:

虽然我知道这是正确的,但我不确定为什么。有没有 stdc++ 知识的人可以向我解释?

0 投票
6 回答
3579 浏览

c++ - 如果我知道我的函数不会抛出异常,我应该将 try...catch 块放在析构函数中吗

我知道析构函数不应该抛出异常。

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.13

我有以下代码:

在我的静态源代码分析中,它抱怨我将以这种方式调用清理函数:

我不确定这是否是一个好习惯,只要它调用函数,就将 try...catch 块放在析构函数中。作为 :

(1) 如果清理函数能够抛出异常,我就知道发生了不好的事情。我更喜欢它是快速失败的。也就是让整个系统崩溃,让程序员去调试。

(2) 进入和退出 try...catch 块时发生开销。

(3) 代码看起来很麻烦,在类的析构函数周围有很多 try...catch 块。

我可能会错过其他一些要点,为什么 try...catch 块应该到位。

谢谢。

0 投票
1 回答
3697 浏览

c# - C# - “析构函数不被继承”实际上是什么意思?

C# 语言规范 3.0的第 10.13 节,析构函数声明如下:

析构函数不是继承的。因此,除了可以在该类中声明的析构函数之外,一个类没有析构函数。

C# 编程指南的析构函数部分包含一个示例,演示如何调用继承层次结构中的析构函数,包括以下语句:

... ...类的析构函数被自动调用,并且按从最派生到最不派生的顺序。

我已经通过各种实际示例对此进行了研究,包括一个具有定义析构函数的基类,以及从基类继承但未定义析构函数的派生类。创建派生类的实例,允许对该实例的所有引用超出范围,然后强制进行垃圾回收,这表明当派生类的实例最终确定时,将调用基类中定义的析构函数。

我的问题是“不继承析构函数”实际上是什么意思,因为虽然你不能显式调用析构函数,但继承链中的析构函数会自动调用,并且即使派生类没有定义析构函数也会调用基类析构函数?

它是否与一些微妙的语义区别有关,即终结是由垃圾收集器而不是 C# 语言/编译器实现的?

编辑1:

虽然 C# 语言规范还声明“实例构造函数不被继承”,但与构造函数相关的行为与析构函数有很大不同,并且更适合 IMO 与“不继承”术语,如下例所示:

与析构函数相关的行为与此非常不同,如以下示例所示,该示例通过仅向基类添加析构函数来扩展前面的构造函数示例。

上面的示例演示了当派生类的实例完成时将调用基类构造函数,即使派生类没有显式定义析构函数。

我的观点很简单,我遇到过很多人没有意识到或不理解会发生这种情况,其中很大一部分原因是“析构函数不是继承的”声明。

编辑2:

C# 语言规范还说明了以下内容并提供了底层实现的代码示例:

析构函数是通过覆盖 System.Object 上的虚拟方法 Finalize 来实现的。不允许 C# 程序覆盖此方法或直接调用它(或覆盖它)。

由于引擎盖下的实现实际上是基于继承的,如上所述,我认为我的问题是有效的,我认为到目前为止我收到的任何回复都没有正确解决这个问题 - 什么“析构函数不是继承的”实际上是什么意思?

0 投票
4 回答
6307 浏览

c# - 析构函数和终结函数的区别?

请注意:这个问题是关于“析构函数”和“终结器”这两个词之间的术语差异及其正确用法。我只是提供了它们在 C# 和 C++/CLI 中的使用示例,以说明我问这个问题的原因。我很清楚它是如何在 C# 和 CLR 中实现的,但我问的是术语的正确使用。


在 C# 世界中,术语“析构函数”和“终结器”似乎可以互换使用,我怀疑这是因为 C# 规范使用“析构函数”一词描述了非确定性清理功能,而 CLR 文档总是使用“终结器”一词,因此在 C# 领域内,它们的含义相同。

但是,在 C++/CLI 规范中,两者之间存在区别。它允许确定性和非确定性清理,并使用术语“析构函数”表示确定性功能,使用“终结器”表示非确定性功能:

终结器提供非确定性清理。终结器是在垃圾回收期间执行的“最后机会”函数,通常在未执行析构函数的对象上执行。

此外,维基百科对析构函数终结器的描述表明析构函数和终结器是独立的概念,并支持 C++/CLI 规范对确定性术语的使用:

与析构函数不同,终结器不是确定性的。当程序显式释放对象时,将运行析构函数。相比之下,终结器在内部垃圾回收系统释放对象时执行。

问题:

  • 从计算机科学的角度来看,“析构函数”和“终结函数”之间是否存在明确定义的区别,或者术语只能根据上下文来定义?

  • 如果存在明确定义的差异,那么为什么 C# 规范会使用“错误”的术语?

0 投票
5 回答
818 浏览

c++ - 发生 SIGABRT 时堆栈是否会展开?

当 C++ 中发生 SIGABRT 时,堆栈是否会展开(析构函数运行)?

谢谢。