问题标签 [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 投票
2 回答
1667 浏览

c# - c# 中的远程处理和析构函数

我正在使用 .net 远程处理功能,有些东西我无法弄清楚,也无法在 Google 中找到答案,这就是对象处理的工作原理。

我尝试通过远程处理实现某种对象池,因为我列出了基本上是字符串和布尔状态指示器的静态对象。

当我请求一个新的远程对象时,(在构造函数期间)我检查池中是否有空闲对象,将其标记为正在使用和对象销毁期间。DismisObject 只是将其标记为“免费”,

超时工作正常 - 在我尝试使用对象时的 5 分钟活动后,我得到了远程处理异常,但是 ~MyRemotableObject() 而不是 Dispose() 函数没有被调用,因此该对象永远不会在池中标记为空闲。即使我关闭程序 - 对象仍然在池中保持活动状态。释放它的唯一方法是手动调用 Dispose 函数(如果程序崩溃或用户离开是打开的,我不能这样做)

有没有办法强制 .net 在关闭连接时处理/销毁对象?(我在某个地方发现 CG 应该偶尔这样做,所以我打开了 4 个客户端并让 2 个崩溃 - 其他 2 个在一段时间后断开连接,但对象仍然标记为活动)

0 投票
12 回答
1798 浏览

c++ - 我如何*不*删除析构函数中的成员?

我希望我的类的析构函数删除整个对象,但其中一个成员除外,该成员在其他地方被删除。首先,这完全不合理吗?假设不是,我该怎么做?我认为创建一个带有空主体的析构函数会阻止所有成员被删除(因为析构函数不会做任何事情),但情况似乎并非如此。

0 投票
2 回答
12029 浏览

delphi - 销毁 TThread 对象的正确方法

这个问题可能看起来微不足道,但我希望你不要忽视它。
在销毁 TThread 对象之前,通常需要等到调用 TThread.Execute() 方法的线程完成,因为只有这样我们才能确定,例如,在类的析构函数中销毁的对象不再被访问。因此需要调用 Terminate 来设置线程必须检查是否退出的 Terminated 标志,然后调用 WaitFor() 方法。

因为线程可能被挂起,我认为在调用WaitFor之前恢复它比较好,否则调用线程会死锁。而且因为线程可以被挂起多次,它应该被恢复相同的次数,对吧?

如果创建的线程是挂起的,我们不必担心当我们恢复线程只是为了终止它时会调用 TThread.Execute() 方法——它不会(如果我错了,请纠正我)。

我所说的建议对每个被释放的 TThread 对象使用以下代码行:

不幸的是,当我们销毁创建了多个线程的应用程序时,为每个被销毁的 TThread 对象编写这样一段代码会不必要地使代码变得很长,甚至可能不透明。

因此,我得出一个结论,所有这些都可以放在 TThread 类的重写析构函数中,这足以调用 MyThread.Free (如果设置了 MyThread.FreeOnTerminate 则调用 MyThread.Terminate )而不关心是否被破坏object 是否为 TThread 对象:

请原谅我问了这么一个基本的问题。但是,我想了解您对这种销毁 TThread 对象的方式(我希望是一种通用方式)的看法。我问这个问题是因为我从同事的代码中了解到,他们通常使用第一个代码示例来销毁此类对象,但他们从未使用过检查正在等待的线程是否没有被挂起,如果线程我认为有点危险可能会暂停在代码中的某处。因此,我试图找到一种销毁此类对象的通用方法,这将使代码更清晰、更安全。我希望我没有让事情变得更糟——你怎么看?

提前感谢您的建议。

0 投票
1 回答
143 浏览

c++ - CMultiDocTemplate 中视图/文档/框架的销毁顺序是什么?

我正在使用具有指向文档框架对象的指针的 MDI 应用程序。其他线程正在使用指针调用 PostMessage。在关闭期间,线程继续尝试在框架被破坏时向框架发布消息。有谁知道MFC的MDI实现中多个文件的销毁顺序?是否有我应该处理的消息可以使这更容易(可能是框架的 ON_WM_CLOSE)?

0 投票
1 回答
1098 浏览

c - 如何使用 GNU Bison 正确破坏令牌语义值(符号记录)并避免内存泄漏?

我正在编写一个简化的 Pascal 解析器/解释器,现在我正在考虑分段错误。我还没有得到它们,一切都运行良好,但由于我是在 Cygwin 下开发的,所以我无法通过 valgrind 测试程序。

基本上我在做什么如下所述:

当然,令牌输入正确和一切。例如,问题是在否定某些表达式时。我通常重用一些 symrec * 而不是 malloc 一个新的。

例子:

当然,这在我的上下文中是无效的(在示例中,我只是将 int 或 double 作为数据类型),我正在正确解析 symrec *,但在这种情况下,析构函数 dealloc $2 不会留下 $$ 为某种悬空指针?

在写这篇文章时,我在想,如果这真的发生并且给我带来了一些段错误,我可以让 $2 = NULL; 并在 %destructor{} 子句中检查?

PS:我不是以英语为母语的人,而且我已经写了很长时间,所以对于任何混淆的想法,请见谅,我会及时重新解释。

0 投票
7 回答
2944 浏览

c++ - 删除 NULL 指针在写入析构函数时不会调用重载删除

在此代码中,当析构函数存在时,delete w不会调用重载运算符。delete如果省略析构函数,delete则调用重载的。为什么会这样?

写入 ~Widget() 时的输出

运算符 new
内存不足

没有写入~Widget() 时的输出

运算符 new
内存不足
运算符 delete

0 投票
8 回答
29881 浏览

c++ - 默认析构函数可以自动生成为虚拟析构函数吗?

默认析构函数可以自动生成为虚拟析构函数吗?

如果我定义了一个基类但没有默认析构函数,是否会自动生成默认的虚拟析构函数?

0 投票
1 回答
572 浏览

clr - 最终确定可达表

如果我在类 Foo 中实现析构函数,则 Foo 的实例将在终结队列上密切跟踪。当 Foo 的实例被垃圾收集时,我知道 CLR 会看到终结队列中的条目,并通过将对象移出堆并进入终结可达表来对该对象进行特殊处理。然后......那个垃圾收集周期没有其他任何事情发生?

在下一个垃圾回收周期中总是会调用 finalize() 吗?

为什么在将我的对象复制到 freachable 表后不立即调用 finalize?(这似乎是额外的不必要的复杂性)

0 投票
5 回答
3763 浏览

c++ - 调用可以在 C++ 中引发异常的函数的析构函数

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

如果我的析构函数调用了一个可以抛出异常的函数,如果我在析构函数中捕获它并且不进一步抛出它可以吗?还是它会导致中止,我根本不应该从析构函数中调用这些函数?

0 投票
11 回答
99741 浏览

c++ - 为什么我们需要 C++ 中的纯虚析构函数?

我理解对虚拟析构函数的需求。但是为什么我们需要一个虚析构函数呢?在其中一篇 C++ 文章中,作者提到当我们想要使类抽象时,我们使用纯虚析构函数。

但是我们可以通过将任何成员函数设为纯虚拟来使类抽象。

所以我的问题是

  1. 我们什么时候才能真正使析构函数成为纯虚拟的?任何人都可以举一个很好的实时例子吗?

  2. 当我们创建抽象类时,使析构函数也成为纯虚拟是一种好习惯吗?如果是的话..那为什么?