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

时间:2015-12-01 12:33:36

标签: c++ instance new-operator

如果我是对的,我需要确认。我创建了一个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类的多个实例。我只想要一个,所以我猜第一种方式就是这个工作。我是对还是不对?这是真的,每次接受信号时第二个都会创建一个新实例吗?

1 个答案:

答案 0 :(得分:0)

  

每次接受信号时,第二个是否会创建一个新实例?

在第二种方式中,您将为每次调用动态分配内存。除非" curve-> setData"取得了CosinusData的所有权,它在完成它之后就不会删除它你正在泄漏内存!

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

我无法安全地说出第一个解决方案,因为我没有看到代码的其他部分(指针所有权的一部分)。从指针的角度来看似乎没问题。但是既然你正在复制并传递两次(首先是cosinusdata,然后是曲线),请确保这里没有昂贵的操作。