Qt編譯錯誤Error - RtlWerpReportException failed with status code :-1073741823
阿新 • • 發佈:2018-12-19
這是一個比較新手入門常見的問題,其實說白了就是記憶體洩漏,很具體的說大部分就是你對類裡面的一個指標變數沒有初始化,一下面的例子為例,m_tooltip未初始化為0導致後面的判斷未申請記憶體導致記憶體洩漏
#ifndef MYBARVIEW_H #define MYBARVIEW_H #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtCharts/QChartView> #include <QtCharts/QBarSeries> #include <QtCharts/QBarSet> #include <QtCharts/QLegend> #include <QtCharts/QBarCategoryAxis> #include"charttip.h" #include"common.h" class QGraphicsScene; QT_CHARTS_BEGIN_NAMESPACE class QChart; QT_CHARTS_END_NAMESPACE class Callout; QT_CHARTS_USE_NAMESPACE class MyBarView: public QGraphicsView { Q_OBJECT public: MyBarView(BarViewParam *bvp, QWidget *parent = 0); void addBar(int setNum,QStringList CategoryNm,QVector<QVector<int> > setValList); public: ChartTip* m_tooltip; //以這個變數為例 QChartView *m_chartView; QStringList m_categories; QBarSeries *m_series; QChart *m_myBarView; QVector<QBarSet*> m_barSetList; QBarCategoryAxis *m_typeAxis; QValueAxis* m_typeAxisY; private: public slots: void sltTooltip(bool status, int index, QBarSet *barset); }; #endif // MYBARVIEW_H
MyBarView::MyBarView(BarViewParam *bvp,QWidget *parent) : QGraphicsView(new QGraphicsScene, parent) { //m_tooltip=0; 註釋掉就會存在記憶體洩漏 m_myBarView=new QChart(); m_myBarView->setAnimationOptions(QChart::SeriesAnimations); m_series=new QBarSeries(m_myBarView); for(int i=0;i<bvp->m_setsNameList.size();i++) { QBarSet *set0= new QBarSet(bvp->m_setsNameList[i]); m_barSetList.append(set0); m_series->append(set0); } // QBarSet *set0 = new QBarSet("Samantha"); //*set0 << 1 << 2 << 3 << 4 << 5 << 6;// Jane 6個月份的值 m_series->setLabelsVisible(true); m_series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd); connect(m_series, SIGNAL(hovered(bool, int, QBarSet*)), this, SLOT(sltTooltip(bool, int, QBarSet*))); m_myBarView->addSeries(m_series); m_myBarView->setTitle(bvp->m_title); QStringList categories; for(int i=0;i<bvp->m_categorieNameList.size();i++) { categories.append(bvp->m_categorieNameList[i]); } //categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; m_typeAxis = new QBarCategoryAxis(); //m_typeAxis->append(categories); m_myBarView->createDefaultAxes();//建立預設的左側的座標軸(根據 QBarSet 設定的值) m_myBarView->setAxisX(m_typeAxis, m_series);//設定座標軸 m_typeAxisY = new QValueAxis; m_typeAxisY->setRange(0, 40); m_typeAxisY->setTickCount(10); //設定多少格 m_typeAxisY->setMinorTickCount(5); //設定每格小刻度線的數目 m_myBarView->setAxisY(m_typeAxisY, m_series); m_myBarView->legend()->setVisible(true); //設定圖例為顯示狀態 m_myBarView->legend()->setAlignment(Qt::AlignBottom);//設定圖例的顯示位置在底部 //m_myBarView->setAcceptTouchEvents(true); m_chartView=new QChartView(m_myBarView); m_chartView->setRenderHint(QPainter::Antialiasing); } void MyBarView::sltTooltip(bool status, int index, QBarSet *barset) { if (m_tooltip == 0)// 由於註釋掉了m_tooltip = 0,所以會執行下面的語句導致記憶體洩漏 m_tooltip = new ChartTip(m_myBarView); if (status) { m_tooltip->setText("X: "+m_categories.at(index)+"\n"+QString("Y: %2 ").arg(barset->at(index))); QPointF point(index, barset->at(index)); m_tooltip->setAnchor(point); m_tooltip->setZValue(11); m_tooltip->updateGeometry(); m_tooltip->show(); } else { m_tooltip->hide(); } }