如果我是对的,我需要确认。我创建了一个QSlider和一个带cos函数的图。 Slider连接到slot_print(int)。目的是移动功能。我以两种不同的方式完成了它:
//---the first way
void plot::slot_print(int a){
cosinusdata->setData(a);
**curve->setData(cosinusdata);**
this->replot();
};
//the second way
void plot::slot_print(int a){
**curve->setData(new CosinusData(a));**
this->replot();
};
//the CosinusData class
class CosinusData: public QwtSyntheticPointData{
public:
int b;
CosinusData(int a):QwtSyntheticPointData(1000){b=a;}
double y(double x) const {return b*qCos(x);}
void setData(int a){b=a;}
};
// constructor
plot::plot()
{
setAxisScale(QwtPlot::xBottom,-3.0,12.5,2);
setAxisScale(QwtPlot::yLeft,-3.0,14.5,3);
curve = new QwtPlotCurve();
**cosinusdata = new CosinusData(1);**
curve->setData(cosinusdata);
curve->attach(this);
}
我不想创建CosinusData类的多个实例。我只想要一个,所以我猜第一种方式就是这个工作。我是对还是不对?这是真的,每次接受信号时第二个都会创建一个新实例吗?
答案 0 :(得分:0)
每次接受信号时,第二个是否会创建一个新实例?
是
在第二种方式中,您将为每次调用动态分配内存。除非" curve-> setData"取得了CosinusData的所有权,它在完成它之后就不会删除它你正在泄漏内存!
最快的修复方法可能是用QSharedPointer传递你传递的CosinusData,但如果可以,最好避免每次调用的动态分配和释放。
我无法安全地说出第一个解决方案,因为我没有看到代码的其他部分(指针所有权的一部分)。从指针的角度来看似乎没问题。但是既然你正在复制并传递两次(首先是cosinusdata,然后是曲线),请确保这里没有昂贵的操作。