【发布时间】:2013-11-17 11:03:56
【问题描述】:
当我尝试在 Qt 中使用异常时,应用程序在任何 throw 语句上都会立即崩溃,而忽略任何 catch(...)-clauses。这是导致崩溃的最少代码:
#include <QString>
int main ( ) {
try {
throw 1;
} catch (...) {
QString a;
}
}
没有QString,即使包含库,它也可以正常工作。
我得到的异常代码是
40000015
和偏移量:
0000bb3f
我将 QtCreator 2.7.2 与 Qt 5.1.0 和 mingw 4.8(QtCreator 附带的版本)一起使用。 我使用 Windows 8 进行构建。
在网络上进行了一些研究后,我尝试将 CONFIG+=exceptions 标志添加到 *.pro 文件中,但仍然出现崩溃。
当我读到 Qt 可以毫无例外地构建时(无论这意味着什么),我检查了默认值,因为我使用的是 QtCreator 附带的预编译版本;这个应该包含异常。
我在预编译器之后检查了临时代码,并且预编译器没有对 main 函数进行任何更改。
当我尝试调试代码时,我注意到它在 throw 语句之后没有执行任何行,它确实崩溃了。
我还是 Qt 的初学者;这是 Qt 构建的问题吗?我应该买一个更新的吗?还是我错过了一些我可以更改以使其正常工作的配置?
编辑:在 Frank Osterfeld 要求我之后,我尝试了其他几个课程。以下是我的发现:
- 按预期工作:
std::stringQPointQCharQDateQMessageLogger
- 崩溃:
QStringQByteArrayQDirQExceptionQFileQRegularExpressionQSet<int>QTimer
【问题讨论】:
-
适用于 gcc 4.7.2 (Linux),同时适用于 Qt 4.8.5 和 Qt 5.1.1。无需在 .pro 文件中配置任何有关异常的内容。我也无法想象这是一个通用的 Qt 问题。也许是特定于mingw的东西。检查它是否也发生在 QString 以外的其他类(比如 QByteArray 或只是一个 QPoint)
-
知道它是否适用于 std::string 也会很有趣。
-
std::string 效果很好。 QByteArray 也会崩溃;但 QPoint 按预期工作
-
也尝试了其他一些课程;与他们更新的问题
-
您的系统中没有其他版本的 Qt 或 MinGW,是吗?如果是这样,请卸载它们。 MinGW 有 3 种不同的“风格”,具有不同的异常处理机制:DWARF-2、SEH、SJLJ。如果您有多个版本的库或编译器,则可能会发生不兼容版本之间的交叉链接,从而导致奇怪的崩溃。
标签: c++ exception-handling mingw qt5