什么情况下不会调用 C++ 析构函数?

2024-04-02

我知道我的析构函数是在堆栈的正常展开和抛出异常时调用的,但不是在调用 exit() 时调用。

还有其他情况我的析构函数不会被调用吗? SIGINT 或 SIGSEGV 等信号怎么样?我认为对于 SIGSEGV,它们不会被调用,但对于 SIGNINT,它们会被调用,我如何知道哪些信号将展开堆栈?

还有其他不被召唤的情况吗?


是否还有其他情况下它们[析构函数]不会被调用?

  1. 长跳转:这些会干扰自然的堆栈展开过程,并且通常会导致 C++ 中未定义的行为。
  2. 过早退出(您已经指出了这些,但值得注意的是,由于抛出异常而已经展开堆栈时抛出会导致未定义的行为,这就是为什么我们永远不应该抛出 dtor 的原因)
  3. 从构造函数抛出不会调用类的 dtor。这就是为什么,如果您在一个构造函数中分配由多个不同指针(而不是智能指针)管理的多个内存块,则需要使用函数级 try 块或避免使用初始值设定项列表并在构造函数中具有 try/catch 块body(或者更好的是,只需使用像scoped_ptr这样的智能指针,因为到目前为止在初始化程序列表中成功初始化的任何成员都将被销毁,即使类dtor不会被调用)。
  4. 正如所指出的,当通过基指针删除类时未能将 dtor 设为虚拟可能无法调用子类 dtor(未定义的行为)。
  5. 无法为运算符 new/new[] 调用调用匹配的运算符 delete/delete[](未定义行为 - 可能无法调用 dtor)。
  6. 在解除分配部分中使用带有自定义内存分配器的新放置时,无法手动调用 dtor。
  7. 使用像 memcpy 这样的函数,它只将一个内存块复制到另一个内存块,而不调用复制向量。 mem* 函数在 C++ 中是致命的,因为它们会破坏类的私有数据、覆盖 vtable 等。结果通常是未定义的行为。
  8. 在不完整类型上实例化一些智能指针(auto_ptr),请参阅此讨论 https://stackoverflow.com/questions/12323028/c-destructor-not-being-called-depending-on-the-linking-order
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么情况下不会调用 C++ 析构函数? 的相关文章

  • 模板类包装任意类型/非类型模板类

    假设我有一个模板类base和一个班级wrapper其中包含一个实例化成员base 我想定义班级wrapper这样它依赖于模板参数包 该参数包只是 传递 给实例化成员base 例如 考虑下面的代码 它工作得很好 include
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 为什么以下代码不允许我使用 fgets 获取用户输入但可以使用 scanf?

    这是一个更大程序的简短摘录 但该程序的其余部分无关紧要 因为我认为我能够隔离该问题 我怀疑这与我使用 fgets 的方式有关 我读过 最好使用 fgets 而不是 scanf 但我似乎无法让它在这里正常工作 当我使用以下代码时 程序不会给我
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • C++0x 中的新 unicode 字符

    我正在构建一个 API 它允许我获取各种编码的字符串 包括 utf8 utf16 utf32 和 wchar t 根据操作系统 可能是 utf32 或 utf16 新的 C 标准引入了新类型char16 t and char32 t没有这么
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 绘图中 x 轴上的时间

    我的 x 轴值采用以下格式 May 23 2018 06 31 52 GMT May 23 2018 06 32 02 GMT May 23 2018 06 32 12 GMT May 23 2018 06 32 22 GMT May 23
  • 简单视差、CSS 图层、滚动时显示最后一部分

    我最近在网络世界中看到了一个非常酷的效果 这就是 层次感 用户将向下滚动页面 最后一部分将出现在页面的前几个部分下方 有时它带有图像 但我发现内容也可以这样显示 现在 我已经很熟悉了z index和 CSS 定位 然而 我似乎无法找到正确的
  • Xcode 13.1 bug 将依赖项编辑为本地

    刚刚升级到 Xcode 13 1 并通过单击具有一些依赖项的 Package swift 文件打开了一个 SPM 项目 在以前的版本中 我可以通过将包的本地克隆拖到项目导航器中来简单地编辑这些依赖项之一 然后 Xcode 将忽略签出的依赖项
  • 如何用两种颜色填充绘图上的单个“pch”点?

    如果您采用下面的代码 如何更改第三个菱形的填充 使其变为半黑 半白 该解决方案适用于任何颜色 data lt c 1 2 3 plot data pch c 23 18 23 cex c 2 5 3 2 5 The pch字符是实际的字体符
  • 如何最小化 Flutter Web 版本的大小?是否需要通知文件?

    My web构建 Flutter Web 应用程序后 我的 Flutter Web 应用程序的文件夹大小达到 5 4MB 这还不错 但我不妨优化一下 我想知道是否有人有任何明显的提示 删除不必要的包 之外的提示 以最小化文件大小 我将在 F
  • setcookie 由于标头而无法正常工作 WordPress

    我有一个 WordPress 插件想要创建 cookie 但它不起作用 我真的很感激帮助 add shortcode watchlist cwatchlist short function cwatchlist short echo div
  • htaccess 加载页面 B 而不是页面 A,无需重定向

    使用 htaccess文件 如何加载page B when page A已加载 我不想更改 URL 它仍然应该显示page A 示例 用户负载www mysite com contact并得到结果www mysite com contact
  • bash 中有 do-while 循环吗? [复制]

    这个问题在这里已经有答案了 有没有do whilebash 中循环 我知道如何编程while在 bash 中循环 while condition do body done 是否有类似的构造 但是对于do while循环 其中body至少执行
  • 从应用程序到服务的通信

    我想从我的 Android 应用程序到我的 Android 服务进行通信 我有两个选择 但我不知道该选择哪个 使用应用程序注册服务 使用 LocalBinder 从应用程序连接到服务 解决方案1 应用程序 public class MyAp
  • Apache Cordova/Visual Studio 2015 工具无法在 IOS 模拟器中启动应用程序

    我尝试在 IOS 模拟器上使用 MacInCloud 和 Remotebuild 测试我的应用程序 一切都运行良好 并且应用程序使用 Remotebuild 进行编译 Visual Studio 随后会显示状态 部署成功 当我在 Mac 上
  • 在 zip 中写入(修改或添加)文件

    我已按照中的说明进行操作这个线程 https stackoverflow com questions 13787318 java util zip replace a single zip file 使用其中的代码 我已经能够将文件添加到
  • 如何使 XMLHttpRequest 在 Firefox 上通过 HTTPS 工作?

    当我尝试通过 XMLHttpRequest 发送 HTTP GET 请求时 它适用于非安全 HTTP 但是当通过 HTTPS 发送时 不同的浏览器给出不同的结果 在火狐 3 0 2 上 GET 请求未到达 Web 服务器 在 IE 7 上
  • 将 Plotly 与 R 结合使用的悬停模式

    当使用 R 和 ggplot2 进行绘图时 有没有办法对悬停模式进行编码 目前 我的代码是 plot lt ggplot data aes var1 var2 text var3 geom point py ggplotly plot 我希
  • Soundcloud API - Access-Control-Allow-Origin 不允许来源

    作为后续通过永久链接而不是 trackid 播放播放列表或曲目 https stackoverflow com questions 19351797 play playlist or track by permalink not track
  • 导致git merge冲突的原因和情况有哪些?

    什么是 必要和充分的条件 和 或 所有案例或一些常见案例 这可能会导致git merge报告合并冲突 如何git merge判断一行或几行是否包含 合并冲突 例如 我有时会看到类似以下的情况 其中Part 1 or Part 2是空的 lt
  • 尝试使用 socket.io 时出现错误

    我目前正在使用 socket io swift 客户端 在 Iphone SE 上运行 这是快速代码 let socket SocketIOClient socketURL URL string http example com 4000
  • 更改 CodeBlocks 中的链接器顺序

    我在 DialogBlocks 5 03 中有一个项目 可以使用 mingw32 正常编译 但使用 CodeBlocks 13 12 显示此错误 F wxWidgets 3 0 0 lib gcc lib libwxmsw30u core
  • 如何计算圆上两点之间的弧角?

    给定一个已知圆心和圆上两点 即已知半径 的圆 如何确定圆上两点之间的最小圆弧角度 将中心到两点变成一对向量 然后推过去this http en wikipedia org wiki Vector 28geometry 29 Dot prod
  • 为什么Android Studio 1.0 rc会开始下载Android SDK而不检测是否存在?

    我已经在我的 Archlinux 盒子里安装了 Android Studio 1 0 rc 和 Android SDK 但是当我尝试创建一个新的Android应用程序时 AS会尝试直接从dl ssl google com下载另一组SDK 我
  • 什么情况下不会调用 C++ 析构函数?

    我知道我的析构函数是在堆栈的正常展开和抛出异常时调用的 但不是在调用 exit 时调用 还有其他情况我的析构函数不会被调用吗 SIGINT 或 SIGSEGV 等信号怎么样 我认为对于 SIGSEGV 它们不会被调用 但对于 SIGNINT