即使显式调用析构函数后也会自动销毁对象

2023-11-30

以下程序:

#include <iostream>
using namespace std;

class Test
{
public:
    Test() { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n"; }
};

int main()
{
    Test(); // Explicit call to constructor
    Test t; // local object
    t.~Test(); // Explicit call to destructor
    return 0;
}

打印以下输出:

Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed

我的问题是,即使在 main() 中显式调用析构函数之后,为什么编译器在退出 main() 之前隐式调用析构函数?

作为一个附带问题,除了在删除运算符中使用之外,是否还有其他使用显式调用析构函数的策略?


您引入了未定义的行为。

根据标准:

§12.4 析构函数

(11) 隐式调用析构函数

(11.3)—对于具有自动存储持续时间的构造对象(3.7.3),当对象所在的块 创建退出 (6.7),

and

15 一旦为一个对象调用了析构函数,该对象就不再存在;该行为是未定义的,如果 为生命周期已结束的对象调用析构函数 (3.8)。 [ 示例:如果析构函数为 自动对象被显式调用,并且该块随后以通常情况下的方式保留 调用隐式销毁对象时,行为未定义。 —结束示例]

您显式调用析构函数或通过调用t.~Test(),然后当对象离开作用域时隐式调用它。这是未定义的。

该标准还提供了此注释:

14 [ 注意:很少需要显式调用析构函数。此类调用的一种用途是针对放置在特定位置的对象 使用放置新表达式进行寻址。这种对对象的显式放置和销毁的使用可以 有必要处理专用硬件资源和编写内存管理设施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使显式调用析构函数后也会自动销毁对象 的相关文章

随机推荐

  • Windows 10 上使用 IE 的量角器失败 - 错误代码 199

    我无法让量角器在 Windows 10 上使用 IE 11 它说Unable to create new service InternetExplorerDriverService并且存在代码 199 我尝试过旧的重新安装 升级节点 npm
  • 如何使用 Power Query 有效地密集表中的排名组

    我一直在尝试最简单的方法对具有组或类别的数据对以下数据进行密集排名 我已经问过类似的问题来对数据进行排名 但这是针对分组数据的 我希望对分数列进行排名 如下所示 使得最高的数字占据第一位置 第一 第二大的数字占据第二位 依此类推 如果有平局
  • 如何使用 Swift 1.2 确定 NS_ENUM 是否为未记录的值

    例如 定义了以下 NS Enum typedef NS ENUM NSInteger Type TypeNone 0 TypeA 1 var x 2 if let type Type Type rawValue x Swift 1 2 ex
  • 从服务器向客户端发送浮点数

    我在用TCP IP套接字编程 我有一个浮点值存储在变量中ret val在我的服务器代码中 我想将其发送给正在等待接收它的客户端 我该怎么做 如果您知道客户端和服务器是同一平台等 您可以简单地使用sizeof float 确定缓冲区大小并从浮
  • Project Tango:坐标系之间的转换和合并点云

    我正在尝试转换采样并存储在 XYZij 数据中的点云 根据document 将相机空间中的数据存储到世界坐标系中 以便可以合并它们 我用于 Tango 监听器的帧对有COORDINATE FRAME START OF SERVICE作为基础
  • 循环中 Plotly 中的 add_trace [重复]

    这个问题在这里已经有答案了 我想在循环中绘制多个轨迹 而不覆盖所有以前的轨迹 In 这个帖子从 2015 年开始 提出了在循环中添加跟踪的解决方案 通过设置evaluate TRUE在plot ly或add trace函数中 然而 从 20
  • 如何使用 forge 加密和解密 pdf blob 并将其存储在 localStorage 中?

    我试图加密一个 pdf 文件 Blob 并将其存储在 localStorage 中 并在离线时读取和解密它 我的应用程序是用 AngularJS 编写的 加密是用forge 这是我下载pdf文件的代码 http get url header
  • 无法过滤使用 Angular 2 中的 Http get 访问的 (MatSelect) 中的数据

    我使用带有输入字段和选择的 Angular Material 创建了一个简单的 Angular 应用程序 在我的选择中 我使用 HTTP get 请求访问数据accountdetails json它位于我的资产文件夹中 我已对选择应用了搜索
  • 为什么我无法在手机浏览器中输入网址来查看我的实时网站?

    我使用一个名为实时服务器在 Visual Studio 代码中 当我实时运行时 浏览器会打开 网址为http 127 0 0 1 5500 index html 为什么我无法在手机浏览器上打开此网址来查看手机上的实时站点 有没有办法做到这一
  • Android 中如何检测平板设备?

    我正在尝试将我为智能手机开发的应用程序移植到平板电脑上 并进行少量修改 Android中有API可以检测设备是否是平板电脑吗 我可以通过比较屏幕尺寸来做到这一点 但是检测平板电脑的正确方法是什么 我认为 API 中没有任何特定标志 基于 G
  • 如何在ECS任务定义命令中转义逗号

    我有 docker 镜像和命令 celery A bits payment tracking app app worker l debug Q celery reports concurrency 3 它在 docker 和 docker
  • 在电子中打开pdf文件

    我需要构建一个应用程序 用户可以在应用程序中打开 PDF 文件 即不通过打开新的浏览器窗口 我需要实现一个后退按钮 可能还需要在 PDF 上实现一些覆盖 有谁知道在 Electron 中是否有一个好的方法来做到这一点 如果您对 Chrome
  • Future.wait() 用于多个 future

    当我的设备没有互联网连接时 我试图捕获错误 我构建了 2 个未来方法 1 个用于导入 json 1 个用于查看数据库 我有一个未来的构建器 它应该在构建网格视图之前等待两个未来完成 但似乎由于连接错误而过早地调用了offlineFlashC
  • 通过 OBEX Object PushProfile 通过蓝牙接收文件

    我的设备使用 OBEX 对象推送配置文件 OPP 通过蓝牙发送数据 使用 adb logcat 我看到我的 Android 设备收到一个连接 但中止此连接 08 22 11 14 37 939 I BtOppRfcommListener 2
  • xslt1.0 替换不起作用

    我的 URL 带有一些特殊字符 我想替换它们 并且我正在使用 xslt 1 0 所以我编写如下代码
  • 限制 Docker 仅公开来自特定 IP 地址的端口

    如何限制 Docker 暴露的容器端口仅来自 IP 列表 只有此 IP 列表才能访问此端口 我尝试过 iptables I DOCKER p tcp dport PORT X j REJECT reject with icmp port u
  • GDB远程调试:无法停止线程

    我有一个数据库服务器在一个目标上 我像这样发射gdbserver 2345 bin ls 接下来 我从主机连接 gdb 并尝试发出下一个命令 gdb target remote 192 168 1 2 2345 Remote debuggi
  • 在 Access SQL 中查询“工作周”

    我有一个来自 MS Excel 2007 的公式 它返回特定月份内特定日期的工作周 B1 IF AND WEEKDAY A2 1 lt gt 1 A2 DATE YEAR A2 MONTH A2 1 A2 WEEKDAY A2 1 7 IF
  • 用于向量和矩阵计算的高性能数学库

    在哪里可以找到矢量和矩阵计算的快速库 我需要高性能 Update I need it for games calculations Go for Blaze Also check out the bench marking in paral
  • 即使显式调用析构函数后也会自动销毁对象

    以下程序 include