QwtPlot - 堆腐败检测

时间:2014-04-02 10:19:19

标签: c++ qt qwt

我的代码中有geap损坏检测。销毁后发生错误。该错误与QwtLegend和QwtPlotCurve指针有关。我试图使用auto_ptr 100%确定memery是否正确解除分配,但甚至认为错误发生。我认为这也与我将这些指针传递给QwtPlot的动作有关。任何人都可以解释我应该如何正确实施?在SSCCE代码下面:

#include "plot.h"

Plot::Plot(QWidget *parent) :
    QwtPlot(parent)
{
    setUpPlot();
    setUpCurves();
}

    void Plot::setUpPlot()
    {
        legend = std::auto_ptr<QwtLegend>(new QwtLegend);
        legend->setFrameStyle(QFrame::Box|QFrame::Sunken);
        this->insertLegend(legend.get(), QwtPlot::BottomLegend);
    }

    void Plot::setUpCurves()
    {
        aXCurve = new QwtPlotCurve("Acceleration in X axis");
        aXCurve->attach(this);
        replot();
    }

Plot::~Plot()
{
    aXCurve->detach();
    delete aXCurve;
    aXCurve = NULL;
}

#ifndef PLOT_H
#define PLOT_H

#include <qwt_plot.h>
#include <qwt_legend.h>
#include <qwt_plot_curve.h>

class Plot : public QwtPlot
{
    Q_OBJECT
public:
    explicit Plot(QWidget *parent = 0);
    ~Plot();

private:
    void setUpPlot();
    void setUpCurves();

    std::auto_ptr<QwtLegend> legend;
    QwtPlotCurve *aXCurve;
};

#endif // PLOT_H

1 个答案:

答案 0 :(得分:3)

我怀疑你的代码中出现了同一个对象(QwtLegend)的双重删除:

  • 由于在Plot课程中使用了auto_ptr,

  • 我怀疑Qwt还删除了使用this->insertLegend(legend.get(), QwtPlot::BottomLegend);调用分配给情节的图例指针。只是查看QwtPlot来源,这很明显:

    QwtPlot::~QwtPlot()
    {
        [..]
        delete d_data; // <- deletes the private data
    }
    

    私人数据使用QPointer删除引用的图例:

    class QwtPlot::PrivateData
    {
    public:
        [..]
        QPointer<QwtAbstractLegend> legend; // <-- will delete the legend
    };
    

因此,我得出结论,您不需要明确删除您的legend,而是依赖于QwtPlot获取所有权的事实。