问题标签 [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.
multithreading - OpenPictureDialog 创建 13 个线程,但在 Delphi 中销毁时不会销毁所有线程
我注意到 TOpenPictureDialog 的一个奇怪行为。
在创建和执行 TOpenPictureDialog 时,创建了 13 个线程,当对话框被销毁时,根据 Windows 活动监视器,线程保持存在,除了 1 个线程消失。
为什么会这样?
我正在使用的代码如下:
我在 Windows 8.1 中使用 Delphi XE2
python - 取消引用 python 主机对象后,释放 SWIG 包装的对象?
我尝试 swig 像这样包装一个 C++ 类:
假设 swig 包装的模块是pytest
,我尝试了以下代码:
我看到了预期的输出“Construct”。但是,有时我看不到输出“解构”。我猜这是因为Test
当我解除分配字典时,持有 C++ 对象的对象没有被解除分配x
。所以我尝试了这个:
我仍然没有看到“解构”。我在退出 ipython shell 时看到了它。所以我的问题是(1)当它们不再被引用时,我如何明确地让 python 释放 swig 包装的 C++ 对象;(2) 有没有一种方法可以让 python 的行为方式是一旦主机 python 对象被取消引用,swig 包装的对象就会立即被释放?
编辑:
当我执行以下操作时,可能会出现问题:
当我试图检查是什么时发出第二个命令x
。然后从Out
ipython 的列表中引用该对象。
所以现在我的问题是:是否保证gc.collect()
将删除所有未引用的变量(即,它们__del__
被调用)?
c++ - 插件中的静态局部变量销毁
我看到了几个关于静态局部变量和类的静态成员的问题。来自此评论中的一条评论,可能是最清晰的一个链接
C++ 入门 说:
每个局部静态变量在第一次执行通过对象的定义之前被初始化。当函数结束时,局部静态不会被破坏;它们在程序终止时被销毁。
但是我发现上面的“程序终止时”的描述是模棱两可的。这是否意味着应用程序退出?或者如果它是插件,是否意味着插件已卸载?
我注意到以前在 Linux 上以发布模式编译时,我的插件中的局部静态变量没有被销毁。但是当我将它更改为类成员时,它会在插件卸载时正确销毁。类/局部静态变量仅在插件中使用。
任何人都可以给出一些解释吗?
c++ - 销毁期间未定义的行为?
让我们考虑以下代码:
我故意没有定义虚拟析构函数。编译器打印了一条关于导致 UB 的消息,是真的吗?
c++ - 如何强制始终首先删除给定资源?
在我的项目中,我有一个事件系统。您可以将回调连接到事件,并且只要发送事件,就会调用您的回调。
连接到事件后,您将获得一个令牌。只要令牌没有被破坏,连接就处于活动状态:
但是,在以下场景中会出现问题:
- 解构类
A
开始 - 场
dummy_instance
被破坏 - 现在事件发生了
- 调用回调是因为
event_connection
尚未销毁 - 回调尝试访问释放的内存,程序崩溃
因此,我需要event_connection_token
始终在回调使用的任何类成员之前将其销毁。现在,如果我想让 100 位其他程序员使用这个事件回调系统,期望他们总是event_connection_token
首先在他们创建的所有类中释放分配是不专业的。我们终于来到了这个问题:
如何强制每个客户端event_connection_token
在客户端类中的其他任何内容被破坏之前删除?
我正在寻找:
- 一个聪明的设计,可以确保令牌总是在没有程序员考虑的情况下首先被删除,或者
- 编译时/运行时检查,让程序员知道他们需要修改代码以便首先删除令牌。
编辑:标记为重复的问题不能解决我的问题。我知道对象的破坏顺序,甚至明确调用.reset()
析构函数将解决我的问题。然而,这不是我的问题的解决方案。问题是我不想让项目中的每个开发人员都记住这条规则(因为这个事件回调系统将在代码中的许多地方使用)。
c++ - 当两个类共享同一个堆对象时,如何避免两次删除指针?
当两个类共享同一个堆对象时,如何避免两次删除指针?我遇到过这样的问题:两个大类对象共享一个大对象。在初始函数中初始化。因为它很大,所以我不想复制它们。我在堆中分配它们并保存指针:
但是当我清理它们时,问题是在A
销毁之后,C
类的实例不在堆中。thenB
的析构函数删除同一个堆区域,并调用C
的析构函数,它崩溃了,因为那里没有C
' 的指针,调用C->destructor
会崩溃。B不知道被删除C
后已经不存在了,销毁自己的成员不会改变。A
B
(C*)p
A
(C*)p
我既不能通过C* p
引用传递也不能传递C**
给 link和A
' s ,因为完成后,本地堆栈变量将不再存在。所以在, 's和's之后会存储未知的内存地址,使用时会崩溃。p
B
p
initial()
C*(a) C*(b)
initial()
A
(C**)p
B
(C**)p
那么在智能指针出现之前,C++ 用户自我管理的传统垃圾回收中的这种情况你是怎么处理的呢?
virtual-machine - 如何使虚拟机不将其文件存储在真实计算机中
我和我的朋友有一个想法,我们可以制作自己的 Windows Destruction 版本。除非我们不知道如何制作它,因此真正的计算机本身也不会感染这些病毒。我们怎么能这样做?
clojure - clojure - 在宏内破坏地图的麻烦
我是clojure的新手,所以请多多包涵。
像这样写一个宏:
该块的第一行let
解构了一个query-params
from 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
键是字符串,而不是关键字 - 因此使用字符串作为键就可以了。
reference - 确定对象是否已被破坏的惯用方法
我一直在尝试找到一种更好的方法来确定特定对象是否已被破坏(destroy(...)
)。我一直这样做的方式是这样的:
然后你做:
我看不出这有什么问题(也许有人可以告诉我其他问题),除了它占用内存并需要放入valid = true;
每个构造函数(并且很丑,因为它使用来自被破坏对象的变量)。当然,最好的情况是有一些神奇的功能,可以告诉你某个对象是否有效valid(c); // true / false
。
所以我的问题是是否有一些标准方法来确定对象是否已被销毁(例如,gc 没有收集该内存位置,并且有效对象位于该位置而没有对 vtable 的引用)并且指针现在几乎悬而未决?如果没有任何好的方法可以做到这一点,那么作为次要问题:这种方法在任何可预见的方面是否危险?
以前,我确保对于来自对象 A -> B 的每个引用,都有一个引用 B -> A,并且在应用破坏 A 的析构函数后,B 对 A 的引用无效。所以我什至不必检查 A 是否被破坏。但是当您想要添加新的引用类型时,这是非常乏味和耗时的,因为您必须同时修改可销毁类 (A) 和引用类 (B)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。
如果我是个白痴,请提前道歉。