You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:21:01