Qt new-多个实例或指向单个实例的指针

Qt new - multiple instances or a pointer to the single one

本文关键字:实例 单个 指针 new- Qt      更新时间:2023-10-16

我需要确认我是否正确。我已经创建了一个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类的多个实例。我只想要一个,所以我想第一种方法就可以了。我说得对不对?每次接受信号时,第二个实例都会创建一个新实例,这是真的吗?

每次接受信号时,第二个实例都会创建一个新实例,这是真的吗?

是的。

第二种方法是,每次调用都动态分配内存。除非"curve->setData"拥有CosinusData的所有权,否则它在完成后不会删除它,这就是在泄露内存!

可能最快的修复方法是用QSharedPointer包装您正在传递的CosinusData,但如果可以的话,最好避免每次调用的动态分配和释放。

我不能肯定地说第一个解决方案,因为我看不到代码的其他部分(指针所有权的一部分)。从指针的角度来看,这似乎是可以的。但由于你要复制和传递两次(首先到余弦数据,然后到曲线),请确保这里没有昂贵的操作。