问题标签 [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.
c++ - 为什么异常时不调用析构函数?
我希望A::~A()
在这个程序中被调用,但它不是:
但是,如果我将最后一行更改为
然后A::~A()
被调用。
我正在使用 Visual Studio 2005 中的“Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86”进行编译。命令行为cl /EHa my.cpp
.
编译器是否像往常一样正确?标准在这个问题上怎么说?
php - PHP:析构函数与 register_shutdown_function
我有一个 PHP 类,可以动态创建一个 PNG 图像并将其发送到浏览器。PHP手册说我需要确保最后调用imagedestroy函数来释放内存。现在,如果我不使用类,我会有一些这样的代码:
但是,我相信适合我班级的地方是在班级的析构函数中调用imagedestroy。
我没有弄清楚析构函数是否以与关闭函数相同的方式被调用?例如,如果用户在浏览器中按下 STOP 按钮时执行停止。
注意:无论您在答案中写什么,请指向一些支持它的文章或手册页(URL)。
c++ - 如何创建通用 std::vector 析构函数?
拥有一个包含指向对象的指针的向量,然后使用 clear 函数不会调用向量中对象的析构函数。我创建了一个函数来手动执行此操作,但我不知道如何将其作为向量中可能存在的任何类型对象的通用函数。
这是我拥有的函数,它适用于向量中的特定类型的对象,但我想要一个可以采用任何类型的向量和对象指针的函数。
c++ - 动态分配对象数组
我有一个包含动态分配数组的类,比如说
但现在我想为这些类创建一个动态分配的数组。这是我当前的代码:
但这炸得太厉害了。因为当循环迭代完成时(通过调用)创建的新A
对象A(3)
被破坏for
,这意味着该myArray
实例A
的内部被delete []
-ed。
所以我认为我的语法一定是非常错误的?我想有一些修复看起来有点矫枉过正,我希望避免:
- 为
A
. - 使用
vector<int>
,vector<A>
所以我不必担心这一切。 - 与其
arrayOfAs
成为一个A
对象数组,不如让它成为一个A*
指针数组。
我认为这只是一些初学者的事情,其中有一种语法在尝试动态分配具有内部动态分配的事物数组时实际上有效。
(此外,风格批评很受欢迎,因为我已经有一段时间没有使用 C++ 了。)
未来观众的更新:以下所有答案都非常有帮助。Martin 的被接受是因为示例代码和有用的“4 规则”,但我真的建议阅读它们。有些是错误的简洁陈述,有些则正确地指出了如何以及为什么vector
s 是一个好方法。
c# - 静态终结器
执行某些静态终结的正确方法是什么?
没有静态析构函数。该AppDomain.DomainUnload
事件不会在默认域中引发。该AppDomain.ProcessExit
事件在所有事件处理程序之间共享三秒(默认设置)的总时间,因此它不是真正可用的。
c++ - 使用虚拟参数的 C++ 类成员函数
我知道您可以使用虚拟“int”参数operator++
并operator--
覆盖这些运算符的后缀版本,但我隐约记得您可以在析构函数上声明的虚拟参数。有谁知道这一点,如果知道,那个虚拟参数做了什么?
这是在我十几岁时(即很久以前)阅读的旧 Turbo C++ 教程书籍中,所以我可能完全记错了它。那也是非常早期的 C++,在它被标准化之前,所以它可能是 Turbo C++ 特有的。
c++ - 强制在 C++ 中最后销毁某些东西
我正在开发一个 C++ 应用程序,该应用程序内部有一些定期创建和销毁的控制器对象(使用新的)。这些控制器必须将自己注册到另一个对象(我们称之为controllerSupervisor),并在它们被破坏时取消注册。
我现在面临的问题是在我退出应用程序时发生的:由于破坏顺序不是确定性的,因此单个 controllerSupervisor 实例在(某些)控制器本身之前被破坏,并且当它们调用 unregister 方法时他们的析构函数,他们这样做是在一个已经被破坏的对象上。
到目前为止,我提出的唯一想法(感冒了,所以这可能并不意味着什么)不是将 controllerSupervisor 作为堆栈上的全局变量,而是在堆上(即使用 new)。但是在那种情况下,我没有删除它的地方(这都在第 3 方类型的库中)。
任何关于可能选项的提示/建议将不胜感激。
c++ - 单元测试析构函数?
有什么好的方法来单元测试析构函数吗?就像说我有一个像这样(人为)的例子:
有什么好的方法可以对此进行单元测试,以确保 x 被删除,而不会用#ifdef TESTs 弄乱我的 hpp 文件或破坏封装?我看到的主要问题是很难判断 x 是否真的被删除了,特别是因为在调用析构函数时对象超出了范围。
c# - 在 C# 中使用 IDisposable 与析构函数有什么区别?
我什么时候在类上实现 IDispose 而不是析构函数?我读了这篇文章,但我仍然没有抓住重点。
我的假设是,如果我在一个对象上实现 IDispose,我可以显式地“破坏”它,而不是等待垃圾收集器去做。它是否正确?
这是否意味着我应该始终明确地在对象上调用 Dispose?有哪些常见的例子?
c++ - 析构函数 C++:类型 '***' 参数赋予'delete',预期指针
我声明了一个私有变量
我的 SomeClass 课程中的某个地方。
为什么我不能说:delete theVector
在我的 SomeClass 析构函数中?
编译器错误说:
什么预期的指针?