问题标签 [destruction]

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 回答
107 浏览

multithreading - OpenPictureDialog 创建 13 个线程,但在 Delphi 中销毁时不会销毁所有线程

我注意到 TOpenPictureDialog 的一个奇怪行为。

在创建和执行 TOpenPictureDialog 时,创建了 13 个线程,当对话框被销毁时,根据 Windows 活动监视器,线程保持存在,除了 1 个线程消失。

为什么会这样?

我正在使用的代码如下:

我在 Windows 8.1 中使用 Delphi XE2

0 投票
0 回答
319 浏览

python - 取消引用 python 主机对象后,释放 SWIG 包装的对象?

我尝试 swig 像这样包装一个 C++ 类:

假设 swig 包装的模块是pytest,我尝试了以下代码:

我看到了预期的输出“Construct”。但是,有时我看不到输出“解构”。我猜这是因为Test当我解除分配字典时,持有 C++ 对象的对象没有被解除分配x。所以我尝试了这个:

我仍然没有看到“解构”。我在退出 ipython shell 时看到了它。所以我的问题是(1)当它们不再被引用时,我如何明确地让 python 释放 swig 包装的 C++ 对象;(2) 有没有一种方法可以让 python 的行为方式是一旦主机 python 对象被取消引用,swig 包装的对象就会立即被释放?

编辑:

当我执行以下操作时,可能会出现问题:

当我试图检查是什么时发出第二个命令x。然后从Outipython 的列表中引用该对象。

所以现在我的问题是:是否保证gc.collect()将删除所有未引用的变量(即,它们__del__被调用)?

0 投票
1 回答
139 浏览

c++ - 插件中的静态局部变量销毁

我看到了几个关于静态局部变量和类的静态成员的问题。来自此评论中的一条评论,可能是最清晰的一个链接

C++ 入门 说:

每个局部静态变量在第一次执行通过对象的定义之前被初始化。当函数结束时,局部静态不会被破坏;它们在程序终止时被销毁。

但是我发现上面的“程序终止时”的描述是模棱两可的。这是否意味着应用程序退出?或者如果它是插件,是否意味着插件已卸载?

我注意到以前在 Linux 上以发布模式编译时,我的插件中的局部静态变量没有被销毁。但是当我将它更改为类成员时,它会在插件卸载时正确销毁。类/局部静态变量仅在插件中使用。

任何人都可以给出一些解释吗?

0 投票
1 回答
51 浏览

c++ - 销毁期间未定义的行为?

让我们考虑以下代码:

我故意没有定义虚拟析构函数。编译器打印了一条关于导致 UB 的消息,是真的吗?

0 投票
2 回答
83 浏览

c++ - 如何强制始终首先删除给定资源?

在我的项目中,我有一个事件系统。您可以将回调连接到事件,并且只要发送事件,就会调用您的回调。

连接到事件后,您将获得一个令牌。只要令牌没有被破坏,连接就处于活动状态:

但是,在以下场景中会出现问题:

  1. 解构类A开始
  2. dummy_instance被破坏
  3. 现在事件发生了
  4. 调用回调是因为event_connection尚未销毁
  5. 回调尝试访问释放的内存,程序崩溃

因此,我需要event_connection_token始终在回调使用的任何类成员之前将其销毁。现在,如果我想让 100 位其他程序员使用这个事件回调系统,期望他们总是event_connection_token首先在他们创建的所有类中释放分配是不专业的。我们终于来到了这个问题:

如何强制每个客户端event_connection_token在客户端类中的其他任何内容被破坏之前删除?

我正在寻找:

  • 一个聪明的设计,可以确保令牌总是在没有程序员考虑的情况下首先被删除,或者
  • 编译时/运行时检查,让程序员知道他们需要修改代码以便首先删除令牌。

编辑:标记为重复的问题不能解决我的问题。我知道对象的破坏顺序,甚至明确调用.reset()析构函数将解决我的问题。然而,这不是我的问题的解决方案。问题是我不想让项目中的每个开发人员都记住这条规则(因为这个事件回调系统将在代码中的许多地方使用)。

0 投票
1 回答
419 浏览

c++ - 当两个类共享同一个堆对象时,如何避免两次删除指针?

当两个类共享同一个堆对象时,如何避免两次删除指针?我遇到过这样的问题:两个大类对象共享一个大对象。在初始函数中初始化。因为它很大,所以我不想复制它们。我在堆中分配它们并保存指针:

但是当我清理它们时,问题是在A销毁之后,C类的实例不在堆中。thenB的析构函数删除同一个堆区域,并调用C的析构函数,它崩溃了,因为那里没有C' 的指针,调用C->destructor会崩溃。B不知道被删除C后已经不存在了,销毁自己的成员不会改变。AB(C*)pA(C*)p

我既不能通过C* p引用传递也不能传递C**给 link和A' s ,因为完成后,本地堆栈变量将不再存在。所以在, 's和's之后会存储未知的内存地址,使用时会崩溃。pBpinitial()C*(a) C*(b)initial()A(C**)pB(C**)p

那么在智能指针出现之前,C++ 用户自我管理的传统垃圾回收中的这种情况你是怎么处理的呢?

0 投票
2 回答
325 浏览

c++ - 临时 A(3) 不应该在打印“Here”之前被销毁吗?

临时文件不应该A(3)在“这里”被打印之前被销毁吗?

输出:

活生生的例子

0 投票
1 回答
318 浏览

virtual-machine - 如何使虚拟机不将其文件存储在真实计算机中

我和我的朋友有一个想法,我们可以制作自己的 Windows Destruction 版本。除非我们不知道如何制作它,因此真正的计算机本身也不会感染这些病毒。我们怎么能这样做?

0 投票
2 回答
123 浏览

clojure - clojure - 在宏内破坏地图的麻烦

我是clojure的新手,所以请多多包涵。

像这样写一个宏:

该块的第一行let解构了一个query-paramsfrom http request- 它产生了这个结构:

{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }

问题在于第二行 - 当我使用时它返回一个空地图select-keys,但是当我说例如(first query#)- 输出看起来像这样:[sort-by billing-account/name]

谁能解释为什么select-keys不起作用?

PS尝试过(get query# :from) & (:from query#)-那里也没有运气。

UPD

键是字符串,而不是关键字 - 因此使用字符串作为键就可以了。

0 投票
1 回答
291 浏览

reference - 确定对象是否已被破坏的惯用方法

我一直在尝试找到一种更好的方法来确定特定对象是否已被破坏(destroy(...))。我一直这样做的方式是这样的:

然后你做:

我看不出这有什么问题(也许有人可以告诉我其他问题),除了它占用内存并需要放入valid = true;每个构造函数(并且很丑,因为它使用来自被破坏对象的变量)。当然,最好的情况是有一些神奇的功能,可以告诉你某个对象是否有效valid(c); // true / false

所以我的问题是是否有一些标准方法来确定对象是否已被销毁(例如,gc 没有收集该内存位置,并且有效对象位于该位置而没有对 vtable 的引用)并且指针现在几乎悬而未决?如果没有任何好的方法可以做到这一点,那么作为次要问题:这种方法在任何可预见的方面是否危险?

以前,我确保对于来自对象 A -> B 的每个引用,都有一个引用 B -> A,并且在应用破坏 A 的析构函数后,B 对 A 的引用无效。所以我什至不必检查 A 是否被破坏。但是当您想要添加新的引用类型时,这是非常乏味和耗时的,因为您必须同时修改可销毁类 (A) 和引用类 (B)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。

如果我是个白痴,请提前道歉。