- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用他人服务的程序。如果程序崩溃,关闭这些服务的最佳方法是什么?在服务器端,我会定义一些检查器来监视客户端是否定期无效。但是我们可以在客户端做任何事情吗?我不确定正常的 RAII 在这种情况下是否仍然有效。我的代码是用 C 和 C++ 编写的。
最佳答案
如果您的应用程序遇到硬崩溃,那么不,您精心设计的清理代码将不会运行,无论它是 RAII 范例的一部分还是您在 main
末尾调用的方法。在导致应用程序终止的崩溃之后,应用程序的清理代码都不会运行。
当然,对于异常情况并非如此。尽管这些最终可能导致应用程序终止,但它们仍然以受控方式触发此终止。通常,运行时库会捕获未处理的异常并触发终止。在此过程中,将执行基于 RAII 的清理代码,除非它也抛出异常。然后你又回到了被毫不客气地从内存中剔除的状态。
但即使您的应用程序清理代码无法运行,操作系统仍会尝试在您之后进行清理。这解决了未释放的内存、句柄和其他系统对象的问题。一般来说,如果你崩溃了,你不用担心释放这些东西。您的应用程序的状态是不一致的,因此尝试执行一堆清理代码只会导致不可预测和潜在的错误行为,更不用说浪费大量时间了。只是崩溃,让系统处理你的烂摊子。 As Raymond Chen puts it :
The building is being demolished. Don't bother sweeping the floor and emptying the trash cans and erasing the whiteboards. And don't line up at the exit to the building so everybody can move their in/out magnet to out. All you're doing is making the demolition team wait for you to finish these pointless housecleaning tasks.
做你必须做的;跳过其他一切。
这种方法的唯一问题是,正如您在这个问题中所建议的那样,当您管理不受操作系统控制的资源时,例如另一个系统上的远程资源。在那种情况下,您几乎无能为力。 最佳 方案是让您的应用程序尽可能健壮,以免崩溃,但即使那样也不是完美的解决方案。考虑一下断电时会发生什么,例如因为用户的猫从墙上拉了电源线。那时不可能运行任何清理代码,因此即使您的应用程序永远不会崩溃,也可能会出现您无法控制的终止事件。因此,您的外部资源必须在发生故障时是可靠的。超时是一种标准方法,也是比轮询更好的解决方案。
根据特定用例,另一种可能的解决方案是在应用程序初始化时运行一致性检查和清理代码。这可能是您为旨在连续运行并在终止后立即重新启动的服务所做的事情。下次重新启动时,它会检查其数据和/或外部资源的一致性,根据需要释放和/或重新初始化它们,然后照常继续。显然,这对于典型的应用程序来说是一个糟糕的解决方案,因为无法保证用户会及时重新启动它。
关于c++ - 程序崩溃时如何释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937292/
我有一个附加了 View Controller 的 AVAudioPlayer 实例。 @property (nonatomic, retain) AVAudioPlayer *previewAudi
我是java初学者。假设我声明了一个 Account 类型的变量 Account _account = new Account("Thomas"); 然后在其他地方我做了这样的事情: _account
我在我的应用程序中使用了 3 个 UIViewController,现在我想知道当我从另一个应用程序切换到另一个 UIViewController 时释放它们是否是一个好主意。显然,这将是隐藏的,当它
我分配了一个直接缓冲区: ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); 我读过: Deallocating Direct Buf
场景。我有一个图表,我可以使用右键单击来执行平移。这非常有效。然后我完美地添加了右键菜单。 问题。现在,即使在拖动操作完成后释放鼠标,也会显示右键菜单。 有没有办法在 Java Swing 或 Jav
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片,因为内存分配/取消分配会导致堆大小增加/减少,从而导致性能下降。其
当我尝试释放缓冲区时遇到问题。每次我尝试将缓冲区传递给释放方法时,都会发生段错误。 Valgrind 确认段错误位于 BufferDeallocate 方法中。 ==30960== Memcheck,
我想知道何时按下或释放修改后的键(Ctrl 或 Shift)。 基本上,用户可以在按下修改键的情况下执行多次击键,而我不想在它被释放之前执行一个操作(想想 Emacs 和 Ctrl + X + S).
我编写了一个相当大的网络应用程序。它运行良好一段时间,然后慢慢开始运行缓慢,因为 DOM 节点开始爬升到 80,000 - 100,000 左右。 所以我一直在 Chrome 开发工具控制台 (DCT
我知道在像 c 这样的语言中,我需要在分配内存后释放它。 (我来自 Java),对此我有几个问题: 当我在做的时候: int array[30]; (即创建一个大小为 30 个整数的数组)与
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to release pointer from boost::shared_ptr? Detach
我有一个可以从多个后台线程访问的类,可能同时访问。我无法复制该类,因为重新创建它的内容(处理或内存方面)可能很昂贵。 也有可能在后台处理仍在继续并访问该属性时替换了此类的属性。 目前我有定期的保留/释
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
我有一个实例变量 NSMutableArray* searchResults。 首先,我初始化它: self.searchResults = [[NSMutableArray alloc] init]
如果我在堆上声明一些东西,比如 char *a=new char[1000] 并且主程序停止,如果没有 delete[]<,那么分配的内存会发生什么 调用?它保留在堆上还是自动释放? 最佳答案 就C+
在开发相机应用时,我遇到了一个异常,该异常仅在我切换到其他应用时发生(onPause() 用于我的应用)。 01-15 17:22:15.017: E/AndroidRuntime(14336): F
使用 JDK 1.8 编译时出现 maven 编译器错误 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (de
将 BufferedImage 保存到磁盘(以释放内存)的最快方法是什么? 我的 Java 应用程序处理大量图像(每约 300 毫秒将图像加载到内存中)。大多数这些图像都会立即被丢弃 (gc),但每隔
使用 JDK 1.8 编译时出现 maven 编译器错误 未能在项目 DUMMY 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:
我是一名优秀的程序员,十分优秀!