QChart初始化触发EXCEPTION_ACCESS_VIOLATION访问违规异常求助
QChart初始化触发EXCEPTION_ACCESS_VIOLATION异常的解决方案
核心问题:Qt对象初始化顺序错误
Qt框架要求QApplication实例必须在所有Qt GUI类(包括QChart、QScatterSeries等继承自Qt图形对象体系的类)的实例化之前完成构造,你当前的代码先创建了QScatterSeries、QChart对象,之后才初始化QApplication,是触发访问越界异常的直接原因。
修复方法
调整代码中对象的创建顺序,将QApplication的初始化移到函数最开头,修正后代码参考如下:
#include <QPainter> #include <QPen> #include <QApplication> #include <QMainWindow> #include <QtCharts> #include <QChartView> #include <iostream> #include <cstring> // 补充strdup需要的头文件 int Graphics::OpenGraphic() { char* myargv[1]; int myargc = 1; myargv[0] = strdup(""); // 第一步先初始化QApplication QApplication a(myargc, myargv); // 再创建所有Qt GUI相关对象 QScatterSeries* redSeries = new QScatterSeries; redSeries->append(0, 6); redSeries->append(2, 4); redSeries->setColor(Qt::red); QScatterSeries* blueSeries = new QScatterSeries; blueSeries->append(3, 8); blueSeries->append(7, 4); blueSeries->append(10, 5); blueSeries->setColor(Qt::blue); QChart* chart = new QChart(); chart->addSeries(redSeries); chart->addSeries(blueSeries); chart->createDefaultAxes(); // 补充:添加series后需要创建默认坐标轴,否则显示可能异常 QMainWindow w; QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); w.setCentralWidget(chartView); w.resize(400, 300); w.show(); int ret = a.exec(); free(myargv[0]); // 释放strdup申请的内存,避免泄漏 return ret; }
其他可排查项
如果调整顺序后仍有异常,可检查以下配置:
- 确认项目预处理器定义中添加了
QT_CHARTS_USE_NAMESPACE宏,避免QtCharts命名空间不匹配导致的隐藏问题 - 确认Release运行目录下的QtCharts动态库是Release版本(即
Qt5Charts.dll,而非Debug版本的Qt5Chartsd.dll),版本不匹配会导致运行时内存访问错误 - 确认Qt主版本、编译器版本和项目配置完全一致,避免混合使用msvc2017/msvc2019、32位/64位的Qt库导致的ABI不兼容问题
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

