问题标签 [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.
c++ - 显式调用 c++ 对象的析构函数
我按照上面的方式编写了代码。我希望析构函数 ~box() 只会被调用一次。但实际上,“destructor executed”这个指标被打印了两次。关于为什么的任何提示?
c++ - 为什么在取消引用/释放动态创建的对象之后,它仍然在 C++ 中被引用?
- 调用对象的析构函数后,它仍然像在内存中一样引用吗?为什么?
- 为什么我们需要为动态创建的对象显式调用析构函数
delete this
呢? - 如果我们使用
delete this;
内部析构函数会发生什么?这是递归调用析构函数吗?
c++ - 创建我的析构函数是一种好的编程习惯吗?
我的 c++ 书说,“当对象被销毁时会自动调用析构函数”。那么,如果我不打算在其中包含任何类似于以下示例的代码,那么创建一个是好还是坏的做法?
我书中的例子是:
c++ - 我可以使用函数指针调用虚拟析构函数吗?
我有类 Data 可以保存指向对象的指针。我希望稍后能够手动调用它的析构函数,为此我需要将其地址存储在一个变量中,但似乎禁止获取构造函数/析构函数的地址。有没有办法解决 ?
c++ - 显式调用析构函数
我偶然发现了以下代码片段:
文本说这个片段应该会导致运行时错误。现在,我不太确定,所以我尝试编译并运行它。有效。奇怪的是,尽管所涉及的数据很简单,但程序在打印“文本”后结结巴巴,一秒钟后就完成了。
我添加了一个要打印到析构函数的字符串,因为我不确定显式调用这样的析构函数是否合法。该程序打印了两次字符串。所以我的猜测是析构函数被调用了两次,因为正常的程序终止不知道显式调用并试图再次销毁对象。
一个简单的搜索确认在自动化对象上显式调用析构函数是危险的,因为第二次调用(当对象超出范围时)具有未定义的行为。所以我很幸运我的编译器(VS 2017)或这个特定的程序。
关于运行时错误的文本是否完全错误?或者运行时错误真的很常见吗?或者也许我的编译器针对这种事情实施了某种防护机制?
c++ - 从构造函数中的 catch 块调用析构函数是否安全?
在我的构造函数中,如果其中的任何代码抛出,我必须销毁任何剩余的资源。我想避免编写重复的代码,所以我只在 catch 块中调用析构函数,而不是释放任何已创建的资源。这安全吗?
我知道如果构造函数抛出,则不会调用析构函数,因此我尝试在 msvc 中编译一些代码,但似乎没有任何问题,但我不确定这是否只是运气。
c++ - 当它是 noop 时是否需要调用非平凡的析构函数?
当您知道在这种特定情况下析构函数是 noop 时,标准是否要求调用非平凡的析构函数?
如果不调用析构函数,代码是否可能被编译器破坏?
用例是一个包含动态分配指针的类。默认情况下,这个指针是new
在构造函数中获得的。此类还可以从分配器中获取其动态分配的指针。该类跟踪它是如何获得其指针的,delete
如果指针是由分配器获得的,则在析构函数中调用,new
如果它是由分配器获得的,则什么都没有,因为分配器将释放内存。存储在动态内存中的数据只是普通类型,因此不需要调用它们的析构函数。
所以问题是,如果我知道它通过分配器获得了它的指针,那么我是否还需要在类上调用析构函数,所以析构函数是一个 noop ?
这是一个最小的简化示例,与问题没有直接关系的所有内容都已删除。
c++ - 静态成员变量(指针)的构造函数和析构函数
我正在研究一个ex1
需要一个静态成员变量的类y
。该静态成员变量是指向ex2
具有自己的构造函数和析构函数的类对象的指针。现在我知道如何y
通过在类外定义变量来初始化它。但是如何调用变量的析构函数y
呢?我需要使用delete
语句,但是该语句的放置位置。我需要调用 class 的构造函数和析构函数ex2
。
我的问题的等效代码如下所示:
输出是:
请帮助了解如何调用ex2
. 在类的所有实例都被销毁之后,还需要调用析构函数ex1
。
c++ - 类和成员析构函数调用了两次
输出:
有人可以向我解释这里发生了什么吗?我希望输出是
(一次当 ~B() 被调用,一次 ~A() 被调用)。
c++ - 在 C++ 中减少“constexpr”对象生命周期是否合法?
对于普通对象(即使是对象const
),可以通过显式调用析构函数来结束它们的生命周期。稍后,例如,程序可以使用放置在同一内存位置启动另一个对象生命周期new
。
但是调用constexpr
对象的析构函数是否合法?它能否产生一些有用的或至少格式良好的程序?
很容易想象相反的情况:
这个(很可能是格式错误的)程序被所有编译器接受,没有任何警告:https ://gcc.godbolt.org/z/aqMbfjxKT
在 Clang 中,它通过constexpr
从A
.