我的代码中有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
答案 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获取所有权的事实。