问题标签 [explicit-destructor-call]

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 投票
4 回答
62 浏览

c++ - 显式调用 c++ 对象的析构函数


我按照上面的方式编写了代码。我希望析构函数 ~box() 只会被调用一次。但实际上,“destructor executed”这个指标被打印了两次。关于为什么的任何提示?

0 投票
2 回答
308 浏览

c++ - 为什么在取消引用/释放动态创建的对象之后,它仍然在 C++ 中被引用?

  1. 调用对象的析构函数后,它仍然像在内存中一样引用吗?为什么?
  2. 为什么我们需要为动态创建的对象显式调用析构函数delete this呢?
  3. 如果我们使用delete this;内部析构函数会发生什么?这是递归调用析构函数吗?
0 投票
1 回答
179 浏览

c++ - 创建我的析构函数是一种好的编程习惯吗?

我的 c++ 书说,“当对象被销毁时会自动调用析构函数”。那么,如果我不打算在其中包含任何类似于以下示例的代码,那么创建一个是好还是坏的做法?

我书中的例子是:

0 投票
3 回答
781 浏览

c++ - 我可以使用函数指针调用虚拟析构函数吗?

我有类 Data 可以保存指向对象的指针。我希望稍后能够手动调用它的析构函数,为此我需要将其地址存储在一个变量中,但似乎禁止获取构造函数/析构函数的地址。有没有办法解决 ?

0 投票
3 回答
3500 浏览

c++ - 显式调用析构函数

我偶然发现了以下代码片段:

文本说这个片段应该会导致运行时错误。现在,我不太确定,所以我尝试编译并运行它。有效。奇怪的是,尽管所涉及的数据很简单,但程序在打印“文本”后结结巴巴,一秒钟后就完成了。

我添加了一个要打印到析构函数的字符串,因为我不确定显式调用这样的析构函数是否合法。该程序打印了两次字符串。所以我的猜测是析构函数被调用了两次,因为正常的程序终止不知道显式调用并试图再次销毁对象。

一个简单的搜索确认在自动化对象上显式调用析构函数是危险的,因为第二次调用(当对象超出范围时)具有未定义的行为。所以我很幸运我的编译器(VS 2017)或这个特定的程序。

关于运行时错误的文本是否完全错误?或者运行时错误真的很常见吗?或者也许我的编译器针对这种事情实施了某种防护机制?

0 投票
2 回答
372 浏览

c++ - 从构造函数中的 catch 块调用析构函数是否安全?

在我的构造函数中,如果其中的任何代码抛出,我必须销毁任何剩余的资源。我想避免编写重复的代码,所以我只在 catch 块中调用析构函数,而不是释放任何已创建的资源。这安全吗?

我知道如果构造函数抛出,则不会调用析构函数,因此我尝试在 msvc 中编译一些代码,但似乎没有任何问题,但我不确定这是否只是运气。

0 投票
1 回答
358 浏览

c++ - 当它是 noop 时是否需要调用非平凡的析构函数?

当您知道在这种特定情况下析构函数是 noop 时,标准是否要求调用非平凡的析构函数?

如果不调用析构函数,代码是否可能被编译器破坏?

用例是一个包含动态分配指针的类。默认情况下,这个指针是new在构造函数中获得的。此类还可以从分配器中获取其动态分配的指针。该类跟踪它是如何获得其指针的,delete如果指针是由分配器获得的,则在析构函数中调用,new如果它是由分配器获得的,则什么都没有,因为分配器将释放内存。存储在动态内存中的数据只是普通类型,因此不需要调用它们的析构函数。

所以问题是,如果我知道它通过分配器获得了它的指针,那么我是否还需要在类上调用析构函数,所以析构函数是一个 noop ?

这是一个最小的简化示例,与问题没有直接关系的所有内容都已删除。

0 投票
1 回答
756 浏览

c++ - 静态成员变量(指针)的构造函数和析构函数

我正在研究一个ex1需要一个静态成员变量的类y。该静态成员变量是指向ex2具有自己的构造函数和析构函数的类对象的指针。现在我知道如何y通过在类外定义变量来初始化它。但是如何调用变量的析构函数y呢?我需要使用delete语句,但是该语句的放置位置。我需要调用 class 的构造函数和析构函数ex2

我的问题的等效代码如下所示:

输出是:

请帮助了解如何调用ex2. 在类的所有实例都被销毁之后,还需要调用析构函数ex1

0 投票
1 回答
54 浏览

c++ - 类和成员析构函数调用了两次

输出:

有人可以向我解释这里发生了什么吗?我希望输出是

(一次当 ~B() 被调用,一次 ~A() 被调用)。

0 投票
1 回答
164 浏览

c++ - 在 C++ 中减少“constexpr”对象生命周期是否合法?

对于普通对象(即使是对象const),可以通过显式调用析构函数来结束它们的生命周期。稍后,例如,程序可以使用放置在同一内存位置启动另一个对象生命周期new

但是调用constexpr对象的析构函数是否合法?它能否产生一些有用的或至少格式良好的程序?

很容易想象相反的情况:

这个(很可能是格式错误的)程序被所有编译器接受,没有任何警告:https ://gcc.godbolt.org/z/aqMbfjxKT

在 Clang 中,它通过constexprA.