【发布时间】:2014-04-23 20:53:54
【问题描述】:
异常安全在现代 C++ 中非常重要。
关于异常安全here 已经有一个很好的问题。 所以我不是在谈论一般的异常安全。我真的在谈论 C++ 中 Qt 的异常安全性。还有一个 question 关于 Stack Overflow 上的 Qt 异常安全性,我们有 Qt documentation。
在阅读了有关 Qt 异常安全的所有内容后,我真的觉得使用 Qt 实现异常安全非常困难。因此,我自己不会抛出任何异常。
真正的问题在于 std::bad_alloc:
- Qt 文档指出从 Qt 的信号槽连接机制调用的槽中抛出异常被视为未定义行为,除非它在槽内处理。
- 据我所知,Qt 中的任何插槽都可能抛出 std::bad_alloc。
在我看来,唯一合理的选择是在抛出 std::bad_alloc 之前退出应用程序(我真的不想进入未定义的行为领域)。
实现这一点的一种方法是重载 operator new 和:
- 如果在 GUI 线程中发生分配失败:退出(终止)应用程序。
- 如果在另一个线程中发生分配失败,只需抛出 std::bad_alloc。
在写那个 operator new 之前,我非常感谢一些反馈。
- 这是个好主意吗?
- 这样我的代码会不会异常安全?
- 甚至可以用 Qt 编写异常安全代码吗?
【问题讨论】:
-
你为什么要处理
std::bad_alloc?如果您的内存不足,那么无论如何通常也无能为力。让它关闭应用程序。 -
为什么你认为任何插槽都可以抛出
std::bad_alloc?如果没有动态分配怎么办? -
@jalf 因为未定义的行为部分。
-
@PetrBudnik 当然,如果没有内存分配一切都很好。我真正的意思是许多插槽必须分配一些内存并且可能会抛出。
-
没关系。该行为不是由 Qt 定义的,但它由 C++ 标准很好地定义:它是一个未处理的异常,并且那些终止程序。所以是的,Qt 变得不可靠,这没关系,因为无论如何你都无法做任何事情。
标签: c++ qt exception c++11 exception-safety