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

python - Python:通过终结器在程序终止之前刷新缓冲区

我保留事务缓存以在水印或对象完成的事件中刷新(到持久存储)。由于不再保证在每个对象上都被调用,因此将类似函数(或自身)挂接到(在初始化期间)的适当方法__del__是什么?__del__atexit.register

如果我没记错的话,这导致该方法绑定到的对象一直存在,直到程序终止。这可能不是问题,但也许有更优雅的解决方案?

注意:我知道 using__del__是不理想的,因为它可能会导致无法捕获的异常,但我想不出另一种方法来做这件事,除非finalize()在我的程序中一直进行级联调用。蒂亚!

0 投票
3 回答
1697 浏览

destructor - 为什么这行代码会出现缓冲区溢出错误?

我只有 1 行代码,这是:

在一个函数里面OnBnClickedButtonGo()。此功能在发布模式下失败,但在调试模式下工作正常。

(我在 Windows XP 上使用 Visual Studio 8。)

错误信息是:

我怀疑它是它的析构函数,它是不可见的和隐含的......但我真的不知道。

PS:我静态链接到 PCRE lib 7.8 版。PS2:不是很相关,但可能会帮助一些无法链接到 PCRE 库的人(我花了几个小时才整理出来):包括#define PCRE_STATIC.

0 投票
3 回答
10449 浏览

c++ - 关于 C++ 中自定义对象的构造函数/析构函数和 new/delete 运算符

假设我有一个我自己创建的链接列表。它有自己的析构函数,可以释放内存。此链接列表不会重载 new 或 delete。

现在,我正在尝试创建一个所述链接列表的数组(如果我理解正确,则打开散列)。然后我在这个开放散列类的构造函数中分配必要的内存。在构造函数中调用的 new 运算符足以正确地为数组分配内存,对吧?我不确定,因为我没有为 Linked List 类重载 new 。

另外,假设我的链接列表数组被称为元素,我可以在析构函数中写“删除 [] 元素”吗?这会为数组中的每个元素调用析构函数并正确释放内存吗?

最后,如果我的两个假设都是正确的(即,我不必重载 new 和 delete 就可以将它们与我的自定义类一起使用),那么重载这些运算符有什么意义呢?

0 投票
3 回答
4585 浏览

c++ - 析构函数:琐碎与隐式定义

据我理解的标准,一个平凡的析构函数是隐式声明的,其类只有基和非静态成员和平凡的析构函数。鉴于此定义的递归性,在我看来,唯一的“递归停止”条件是找到具有非隐式声明的析构函数(即用户声明)的基本或非静态成员。如果这是正确的,那应该意味着微不足道的析构函数是“不需要做任何事情”的析构函数,因此它将被声明(隐式)但未定义。以另一种方式说:根据标准定义,隐式定义的析构函数(即“它做某事”)不能是微不足道的说法是否正确?

对于那种愚蠢的问题,我很抱歉,但我想澄清一下我脑海中的一些事情......

0 投票
4 回答
5704 浏览

c++ - “删除这个”有什么用?

今天,我看到了一些遗留代码。在析构函数中有一个类似“ delete this”的语句。我认为,这个调用将是递归的。为什么它在工作?

我在 Y! 上快速搜索了一下,发现如果需要限制用户创建堆栈对象,我们可以将析构函数设为私有并提供删除实例的接口。在提供的接口中,我们必须对该指针调用delete。

还有其他情况可以使用此类语句吗?

0 投票
1 回答
10424 浏览

c++ - 内置类型的析构函数(int、char 等)

在 C++ 中,以下代码给出了编译器错误:

这段代码几乎相同,我只是将 int 类型定义为另一种类型,然后发生了一些神奇的事情:

为什么第二个代码有效?一个 int 是否仅仅因为它已被类型定义而得到一个析构函数?

如果您想知道为什么有人愿意这样做:这来自重构 C++ 代码。我们正在删除标准堆并用自制池替换它。这需要我们调用placement-new 和析构函数。我知道为原始类型调用析构函数是没有用的,但是我们仍然希望在代码中使用它们,以防我们以后用真正的类替换 POD。

发现裸 int 不起作用但 typedefed 起作用是相当令人惊讶的。

顺便说一句 - 我有一个涉及模板功能的解决方案。我们只是在模板中键入定义,一切都很好。

0 投票
2 回答
559 浏览

c++ - 我应该将 throw() 添加到我的 C++ 析构函数的声明中吗?

我见过一些 C++ 类的析构函数定义如下:

这是一个好主意吗?

我很清楚析构函数永远不应该抛出异常,但这实际上会阻止我在析构函数中抛出异常吗?我不是 100% 确定它保证了什么。

参考:这个最近的问题

0 投票
3 回答
1585 浏览

c++ - 析构函数与成员函数竞赛

当我在析构函数中时,是否有其他线程将开始执行对象的成员函数?如何处理这种情况?

0 投票
7 回答
2196 浏览

c++ - 为什么在这段代码中忽略了析构函数?

以下代码演示了我在 Turbo C++ Explorer 项目中遇到的一个奇怪问题。D::D() 中的三个堆栈对象之一在超出范围后不会被销毁。

只有在发布模式下编译时才会发生这种情况,auto_ptrs a_ 和 b_ 的类型不同,并且抛出的异常不继承自 std::exception。它似乎在 VC++ 2005 和 C++ Builder 2009 中运行良好。我确实安装了 BDS2006 更新 2、修补程序汇总和修补程序 12。

是我的代码还是编译器?你知道修复吗?不能在 VCL 项目中可靠地使用 auto_ptr 会很不方便。



预期的:


拿到:


得到(行 ' // std::auto_ptr<C> c_;' 未注释):


编辑:进行了建议的更改

编辑 2:
我刚刚使用 C++ Builder 2007 (11.0.2902.10471) 对其进行了测试,它显示了同样的问题。只要我检查了项目 -> 选项 -> C++ 编译器 -> 调试中的“调试信息”框,发布配置就会起作用。令我惊讶的是,启用“调试信息”后可执行文件变得更小(从 39.5 KB 降至 31.5 KB)。

编辑 3:
在 Turbo C++ Explorer (C++ Builder 2006) (10.0.2288.42451) 中,如果我取消选中项目 -> 选项 -> C++ 编译器 -> 调试中的“内联函数扩展 (-vi)”框,则发布配置有效。将第一行 ( #include <memory>) 替换为以下代码也可以正常工作。

0 投票
8 回答
3069 浏览

c++ - C++ 析构函数的奇怪行为

仅从命令行运行时,这个小程序需要一秒钟的时间来执行。但在调试器中运行时,需要 8 秒以上。暂停调试器表明它正在销毁所有这些向量。怎么回事?

注意 - Visual Studio 2008 SP1,Core 2 Duo 6700 CPU,2GB RAM。

补充:为了澄清,不,我不会混淆调试和发布版本。这些结果在同一个 .exe 上,中间甚至没有任何重新编译。事实上,在 Debug 和 Release 构建之间切换并没有改变。