程序崩溃时如何释放资源

2023-12-09

我有一个使用其他人的服务的程序。如果程序崩溃,关闭这些服务的最佳方法是什么?在服务器端,我将定义一些检查器来定期监视客户端是否无效。但是我们可以在客户端做任何事情吗?我不确定正常的 RAII 在这种情况下是否仍然有效。我的代码是用 C 和 C++ 编写的。


如果您的应用程序遇到严重崩溃,那么不,您精心设计的清理代码将不会运行,无论它是 RAII 范例的一部分还是您在末尾调用的方法。main。没有一个应用程序的清理代码在导致应用程序终止的崩溃后运行。

当然,对于例外情况则不然。尽管这些最终可能导致应用程序终止,但它们仍然以受控方式触发此终止。通常,运行时库会捕获未处理的异常并触发终止。在此过程中,将执行基于 RAII 的清理代码,除非它也引发异常。然后你又回到了被毫不客气地从记忆中剔除的状态。

但即使你的应用程序的清理代码无法运行,操作系统仍会尝试在您之后进行清理。这解决了未释放内存、句柄和其他系统对象的问题。一般来说,如果你崩溃了,你不用担心释放这些东西。您的应用程序的状态不一致,因此尝试执行一堆清理代码只会导致不可预测且可能错误的行为,更不用说浪费大量时间了。只是崩溃,让系统来处理你的混乱。正如雷蒙德·陈所说:

该建筑正在拆除。不用费心扫地、清空垃圾桶和擦白板。并且不要在建筑物的出口处排队,这样每个人都可以将他们的进/出磁铁移出。你所做的只是让拆迁队等你完成这些毫无意义的清理工作。

做你必须做的事;跳过其他一切。

正如您在这个问题中所建议的,这种方法的唯一问题是,当您管理不受操作系统控制的资源时,例如另一个系统上的远程资源。在这种情况下,您无能为力。这best场景是使您的应用程序尽可能健壮,以免崩溃,但即使这也不是一个完美的解决方案。考虑一下断电时会发生什么,e.g.因为用户的猫把电线从墙上拉了下来。那时可能不会运行任何清理代码,因此即使您的应用程序从未崩溃,也可能会出现超出您控制范围的终止事件。因此,你的外部资源must在发生故障时保持稳健。超时是一种标准方法,也是比轮询更好的解决方案。

根据特定用例,另一种可能的解决方案是在应用程序中运行一致性检查和清理代码初始化。您可能会对旨在连续运行并在终止后立即重新启动的服务执行此操作。下次重新启动时,它会检查其数据和/或外部资源的一致性,根据需要释放和/或重新初始化它们,然后继续正常运行。显然,对于典型的应用程序来说,这是一个糟糕的解决方案,因为无法保证用户会及时重新启动它。

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

程序崩溃时如何释放资源 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 选择不同数据库中的列

    是否可以在位于同一服务器上的不同数据库之间执行选择 或插入 语句 如果是 怎么办 您可以使用以下语法指定数据库databasename tablename Example SELECT mydatabase1 tblUsers UserID
  • 如何彻底卸载oracle 11g?

    如何从笔记本电脑上卸载 Oracle 11g 软件附带的卸载程序并不能完全卸载所有组件 我用Oracle12c试了一下 留下了很多程序 我尝试手动删除这些文件 但 BIN 目录中的某些 dll 文件无法访问 我想用 11g 做正确的事 有什
  • 使用jquery从父页面访问子IFrame中的元素

    我尝试使用以下代码从父文档访问 iframe 中文档的元素 但由于某种原因无法使其工作 父级 html
  • 需要帮助使用 GIOService(GLib、Glib-GIO)实现简单的套接字服务器

    我正在学习使用 GLib 编写简单 高效的套接字服务器的基础知识 我正在尝试 GSocketService 到目前为止 我似乎只能接受连接 但随后它们立即关闭 从文档中我无法弄清楚我错过了哪一步 我希望有人能为我阐明这一点 运行以下命令时
  • 如何提高最低成本路径模型的模拟速度

    通过使用网络扩展 以下代码在两个多边形 由多个面片组成 之间构建成本最低的路径 to calculate LCP ID polygon 1 ID polygon 2 let path let path cost 1 Define polyg
  • 如何确定用户在汇编语言 X86 中输入的字符串中单词的频率?

    我是汇编语言编程的完全初学者 我需要帮助编写一个汇编语言程序来从用户那里获取字符串 计算并显示每个单词在用户输入的字符串中出现的次数 例如 如果用户输入 Hello Hello what is new Hello what is not n
  • 查找数组一中最接近数组二的元素

    这个答案解释如何找到最接近 已排序 的数组元素单点 以对大型数组有效的方式 稍作修改 def arg nearest array value idx np searchsorted array value side left if idx
  • 如何使用 XAML 绑定按钮单击来更改面板(网格)的内容

    我正在创建 WPF 应用程序的 UI 在致力于软件功能的实现时 我在创建 UI 方面没有太多经验 现在我需要一种方法来更改 属性 面板的内容 该面板有一个网格来包含内容 我创建了多个面板 隐藏了除一个之外的所有面板 现在我想在用户单击顶部功
  • Slim PHP 的默认 GET 路由

    我最近使用 Slim PHP 框架构建了一个小型 API 它运行得很好 然而 我想为根 设置一个 GET 路由 它以基本消息响应 并让任何其他 GET 请求返回 访问被拒绝 在阅读了文档和各种示例后 我无法弄清楚如何完成这些任务 我的项目仅
  • APC 3.1.x 的稳定性如何?

    是否有人在大容量站点的生产中使用 APC 3 1 x 3 1 系列被标记为 测试版 版本 但它具有我们真正希望拥有的一些功能 具体来说 apc clear cache user 的性能改进没有成为 3 0 19 那么 您是否在非常活跃的站点
  • Python - 根据列的最大值删除重复项

    我不太擅长使用 pandas 我认为 pandas 应该解决我的问题 我有一个文本文件 其中包含数据 id1 id2 value1 value2 value3 1 2 30 40 20 3 1 2 30 42 26 2 3 5 12 55
  • 从 NTFS-MFT 参考号获取文件信息

    在我的 C 应用程序中 我已经有一种方法来检查文件系统 但我想利用从主文件表 MFT 中读取数据的优势 因为它的速度要快得多 我了解 1 它是专有规范 因此如有更改 恕不另行通知 2 仅当应用程序在管理权限下运行时才能访问它 我设法通过读取
  • 在 xpath/domdocument 查询中查找与给定字符串匹配的链接

    使用 Xpath 和 domDocument 获取与给定单词匹配的链接进行显示时遇到问题 一切似乎都进展顺利for i 0 i lt documentLinks gt length i 用来 谁能帮我解决我哪里出错了 html ol htm
  • 更新预填充数据库

    我为 Android 设备创建了一个问答游戏 我有一个数据库 在资产文件夹和 dbHelper 类中存在问题 一切正常 但现在我想修复一些拼写错误并添加更多问题 我需要更新数据库 但我不知道该怎么做 我在互联网上找到了这个 dbHelper
  • 单击事件在具有触摸事件的 iPad 上不起作用

    我正在页面链接上使用点击事件 在 iPad 上运行良好Safari 但是当我在同一页面上使用触摸事件时 单击事件将停止工作 iPad 上只有触摸事件有效 点击事件 link onclick onLinkClick 触摸事件 sdiv bin
  • 为什么 Application.Speech.Speak 单独读取一些数字而不是将它们放在一起?

    假设现在是 11 点 11 分 它读作 一一 小时 十一 分钟 如下所示 Sub TEST1 Application Speech Speak It is Hour Now hours and Minute Now minutes End
  • UnicodeWarning:Unicode 相等比较无法将两个参数转换为 Unicode

    我知道很多人以前遇到过这个错误 但我找不到解决我的问题的方法 我有一个想要规范化的 URL url u http www dgzfp de Dienste Fachbeitr C3 A4ge aspx EntryId 267 Page 5
  • 与 CSS 并排的列内的元素保持相同的高度

    我有一个这样的模板 我想在两列的每一项之间保持相同的高度 具体取决于高度最大的一项 但前提是它们并排时 在较小的屏幕中 当它们的 width 100 时 每个 div 都有自己的高度 具体取决于其自己的内容高度 它应该看起来像这样 我认为我
  • 为什么 git 对标记为二进制的文件发出 CRLF 警告?

    我有一个已标记为二进制的文件 cat gitattributes dist binary git check attr a dist app js dist app js binary set dist app js diff unset
  • 程序崩溃时如何释放资源

    我有一个使用其他人的服务的程序 如果程序崩溃 关闭这些服务的最佳方法是什么 在服务器端 我将定义一些检查器来定期监视客户端是否无效 但是我们可以在客户端做任何事情吗 我不确定正常的 RAII 在这种情况下是否仍然有效 我的代码是用 C 和