正确分配和重新分配了子类QCPGraph

时间:2018-08-30 21:19:43

标签: c++ qt inheritance memory-management qcustomplot

我正在使用QCustomPlot,并已将其QCPGraph细分为一个可绘制图形。

class QCPDrawableGraph : public QCPGraph {
    Q_OBJECT
public:
    QCPDrawableGraph(QCPAxis* x, QCPAxis* y) : QCPGraph(x,y) {
        //do stuff
    }
    virtual ~QCPDrawabelGraph() {} // necessary?
    //class stuff
};

通常,人们会通过以下方式创建新的图形

QCustomPlot plot(parent); //where parent is the parent widget of the gui
QCPGraph* gr = plot->addGraph(); // in case of QCPGraphs or
QCPGraph* gr = new QCPGraph(plot->xAxis,plot->yAxis); // as with all other QCPAbstractPlottables

我会像使用

一样使用自己的课程吗?
QCPDrawableGraph* dgr = new QCPDrawableGraph(plot->xAxis,plot->yAxis); //?

QCustomPlot的析构函数是否仍然可以解决最后的分配问题?

1 个答案:

答案 0 :(得分:1)

QWidget的内存管理的一般概念是,父小部件会在删除子级时关心删除子级。

如果QWidget成为另一个的子代,则要么在构造器中指定了父代(几乎每个小部件构造器都提供了一个父指针),要么将该子代添加到了父代小部件。

OP的QCPDrawableGraph也是如此。

在文档中明确提到。的QPCGraphConstructor & Destructor Documentation):

  

创建的QCPGraph将自动注册到从 keyAxis 推断出的QCustomPlot实例中。此QCustomPlot实例拥有QCPGraph的所有权,因此请勿手动删除它,而应使用QCustomPlot::removePlottable()

作为OP的QCPDrawableGraph的构造函数

QCPDrawableGraph(QCPAxis* x, QCPAxis* y) : QCPGraph(x,y) {
    //do stuff
}

告诉基本构造方法此行为应正确继承。


关于破坏的一些样本:

#include <iostream>

struct Base {
  virtual ~Base() { std::cout << "Base::~Base()\n"; }
};

struct Derived: Base {
  ~Derived() { std::cout << "Derived::~Derived()\n"; }
};

int main()
{
  Base *p = new Derived();
  delete p;
  return 0;
}

输出:

Derived::~Derived()
Base::~Base()

Live Demo on ideone

注释:

  1. 析构函数~Derived()virtual,即使没有virtual关键字,因为其基类Base的析构函数也是。

  2. 尽管通过删除指向基类~Derived()的指针,但析构函数Base被首先调用。 (这是虚拟析构函数的目的。)

  3. 还调用了所有基类的析构函数(以及构造函数,但顺序相反)。