1. 程式人生 > >Qt編譯錯誤Error - RtlWerpReportException failed with status code :-1073741823

Qt編譯錯誤Error - RtlWerpReportException failed with status code :-1073741823

這是一個比較新手入門常見的問題,其實說白了就是記憶體洩漏,很具體的說大部分就是你對類裡面的一個指標變數沒有初始化,一下面的例子為例,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();
    }
}