析构函数可以递归吗?

2023-12-19

这个程序定义是否明确,如果没有,到底为什么?

#include <iostream>
#include <new>
struct X {
    int cnt;
    X (int i) : cnt(i) {}
    ~X() {  
            std::cout << "destructor called, cnt=" << cnt << std::endl;
            if ( cnt-- > 0 )
                this->X::~X(); // explicit recursive call to dtor
    }
};
int main()
{   
    char* buf = new char[sizeof(X)];
    X* p = new(buf) X(7);
    p->X::~X();  // explicit call to dtor
    delete[] buf;
}

我的推理:虽然调用析构函数两次是未定义的行为 https://stackoverflow.com/questions/2771567/why-exactly-is-calling-the-destructor-for-the-second-time-undefined-behavior-in-c,根据 12.4/14,它的确切内容是这样的:

该行为是未定义的,如果 为对象调用析构函数 谁的生命已经结束

这似乎并没有禁止递归调用。当对象的析构函数正在执行时,该对象的生命周期尚未结束,因此再次调用析构函数并不是UB。另一方面,12.4/6 说:

执行主体后 [...] X 类的析构函数调用 X 的直接成员的析构函数, X 直接基的析构函数 课程 [...]

这意味着从析构函数的递归调用返回后,所有成员和基类析构函数都将被调用,并且当返回到上一级递归时再次调用它们将是UB。因此,没有基类且只有 POD 成员的类可以具有没有 UB 的递归析构函数。我对吗?


答案是否定的,因为 §3.8/1 中“生命周期”的定义:

类型对象的生命周期T结束时间:

— if T是具有非平凡析构函数的类类型 (12.4),析构函数调用开始,或者

— 对象占用的存储被重用或释放。

一旦析构函数被调用(第一次),对象的生命周期就结束了。因此,如果您从析构函数内调用对象的析构函数,则根据第 12.4/6 节,行为是未定义的:

如果为生命周期已结束的对象调用析构函数,则行为未定义

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

析构函数可以递归吗? 的相关文章

随机推荐

  • 如何使用 rstanarm 以 APA 风格报告贝叶斯线性(混合)模型?

    我目前正在努力解决如何按照 APA 6 建议报告输出的问题rstanarm stan lmer 首先 我将在频率论方法中拟合混合模型 然后尝试使用贝叶斯框架执行相同的操作 这是获取数据的可重现代码 library tidyverse lib
  • 如何添加Voronoi图?

    我想向我的集群添加 Voronoi 图 也就是说 我想要一张包含我的簇 质心 Voronoi 区域的图 有简单的方法吗 I tried x lt c 4 7 9 2 3 3 7 7 8 8 9 9 y lt c 6 3 3 6 5 7 2
  • Symfony2 从表中删除记录

    我的树枝上有一个按钮 我希望能够使用它从表中删除记录 当我点击删除按钮时 页面会重新加载 但不会删除任何记录 这是我的树枝 h1 Admin Area The football blog h1 table class zebra thead
  • 当 JSpinner 失去焦点时用户输入无效值时如何“注意/陷阱”

    这是 SSCCE 对我之前问题的延续 上一个问题 https stackoverflow com questions 20902932 how to check manual edits on a jspinner field using
  • 编辑复制到剪贴板的LMC按钮

    我有一些问题LMC 按钮 http www lettersmarket com view blog a 3 copy to clipboard lmcbutton html因为它的编码方式 ShowLMCButton Copied Text
  • PostgreSQL JDBC getGenerateKeys 返回所有列

    我最近在一个项目的后端从 MySQL 切换到 PostgreSQL 并发现我的一些数据库代理方法需要审查 为了插入链接的对象 我使用事务来确保存储所有内容 我使用 jdbc 方法执行此操作 例如setAutoCommit false and
  • 未找到符号。 Collect2:ID 返回 1 退出状态

    我收到以下错误 Undefined symbols OBJC CLASS SurveyDelegate referenced from objc class ref to SurveyDelegate in Menus o ld symbo
  • 如何使用存储为 CSV 的矢量数据在 mahout 中执行 k 均值聚类?

    我有一个包含数据向量的文件 其中每行包含一个以逗号分隔的值列表 我想知道如何使用 mahout 对这些数据执行 k 均值聚类 wiki 中提供的示例提到了创建sequenceFiles 但除此之外 我不确定是否需要进行某种类型的转换才能获取
  • 使用 C# 检测文件名字符是否被视为国际字符

    我编写了一个小型控制台应用程序 下面的源代码 来定位并选择性地重命名包含国际字符的文件 因为它们是大多数源代码控制系统持续痛苦的根源 下面有一些背景知识 我使用的代码有一个简单的字典 其中包含要查找和替换的字符 并删除使用超过一个存储字节的
  • SQL Server 2012:如何将所有数据库存储过程编写成单独的 .sql 文件?

    我想编写从 SQL Server 2012 到 Visual Studio 2012 的所有存储过程的脚本 sql文件 在不同的项目中 我怎么做 我想要每个存储过程都有一个 sql 文件吗 在 SQL Server 2012 中右键单击 D
  • 为什么我的谓词没有回溯?

    我不明白为什么我的谓词不回溯并找到所有解决方案 person john person erik allExceptSpider person Spider T setof person X person X S subtract S per
  • 使用铯最轻的方法是什么?

    我有兴趣使用 Cesium 构建带有自定义图块的 3D 地球 但根据此处为 开始 说明 http cesiumjs org 2013 04 12 Cesium up and running 似乎您必须下载一个巨大的 30mb 目录并将整个内
  • Thymeleaf 选择选项性能问题

    我最近一直在摆弄 Spring MVC 5 和 Thymeleaf 3 0 并注意到一些奇怪的事情 我已经开始根据网站上的教程实现下拉列表 并注意到一些性能问题 如果我使用以下代码 我的页面大约需要 5 5 秒才能呈现大约 100 个项目的
  • android 滑动层activity动画

    我想实现滑动层动画以进行活动转换 如材料设计指南中所述 然而 我现在所能做的就是将 slip in 和保持动画简单组合起来 这不会给我带来堆叠层的效果 我怎样才能实现它 我目前的实施 活动开始时 activity overridePendi
  • 如何在SSIS包中设置变量?

    我需要在我的 SSIS 包中使用两个变量 extract beg date and extract end date 我如何设置它们以某种方式行事 例如 在存储过程中 它看起来像这样 SET extract beg date CASE WH
  • 如何在使用 XmlHttpRequest 和 FormData 时设置边界

    我试图在使用 FormData 发布 XmlHttpRequest 时在标头中正确设置边界 xhr open POST url xhr setRequestHeader Content type multipart form data bo
  • html2canvas 等待图像加载

    我遇到这个问题已经有一段时间了 但我似乎找不到解决方案 我正在使用最新的 html2canvas js 插件来截取使用 fllotcharts 制作的图表的屏幕截图 然后通过隐藏输入提交 base64 屏幕截图 问题是带有图表的 div 也
  • 排序依据和限制

    我需要执行以下查询 SELECT FROM specimens ORDER BY distribution sheet id DESC LIMIT 10 我已经把 我喜欢输出 limit 10 而不是 limit 1 我想它是 last 但
  • 不同主机上的 OpenMP 程序

    我想知道是否可以在多个主机上运行 OpenMP 程序 到目前为止 我只听说过可以在多线程上执行但都在同一台物理计算机上执行的程序 是否可以在两个 或更多 客户端上执行程序 我不想使用 MPI 是的 可以在分布式系统上运行 OpenMP 程序
  • 析构函数可以递归吗?

    这个程序定义是否明确 如果没有 到底为什么 include