【发布时间】:2011-03-09 00:39:11
【问题描述】:
Wikipedia 说“一段代码被称为是异常安全的,如果代码中的运行时故障不会产生不良影响,例如内存泄漏、存储数据乱码或无效输出。异常-即使发生异常,安全代码也必须满足放置在代码上的不变量。”
看来我们需要异常处理来保证异常安全。另一方面,在我看来,异常处理在 Qt 应用程序中并不是很流行。
您在 Qt 中满足异常安全的最佳实践是什么?你用什么来代替异常处理?
【问题讨论】:
-
QT 是一个非常古老的库,在异常安全方面非常糟糕。考虑所有小部件如何必须进行堆分配,但 RAII 没有智能指针。您可以做的最好的是将它们分配到 auto_ptr 中,并在插入时将内存释放给父级/布局。他们有一些基本的规定,比如 QMutexLocker,因为在互斥锁被锁定时抛出将是灾难性的,但是他们需要提供更多的东西,或者你必须自己做很多工作才能以异常安全的方式使用 qt .
-
@stinky472:错了。 QSharedPointer
-
@stinky472:哪些 GUI 工具包允许小部件进行堆栈分配?你为什么要这样做?听起来像是一个“稻草人”的论点。
-
@KCArpe 声明是“考虑如何必须为所有小部件进行堆分配***但没有用于 RAII 的智能指针。”我不是在抱怨小部件是堆分配的,通过像 QT 这样基于继承和多态的设计,这变得非常重要。我抱怨 QT 的内存管理模型缺乏 RAII 和异常安全性。
-
看看官方 QT 文档中的这个基本示例:menuBar = new QMenuBar; fileMenu = new QMenu(tr("&File"), this);如果 operator new 在创建 fileMenu 时抛出异常会怎样?糟糕,内存泄漏。同样,QT 并不是为异常安全而设计的。从异常安全的角度来看,即使是诺基亚的例子也不正确。
标签: c++ qt exception exception-handling