正确分配和释放子类 QCPGraph

Correct allocation and deallocation of a subclassed QCPGraph

我正在使用 QCustomPlot 并进行了子classed 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

我会像

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

QCustomPlot 的析构函数最后是否仍然处理释放分配?

QWidget 内存管理的一般概念是,父窗口小部件关心子窗口小部件的删除,如果它们自己被删除。

一个 QWidget 如果在构造函数中给出父项(几乎每个小部件构造函数都提供一个父指针)或者将子项添加到父小部件,则 QWidget 成为另一个子项。

OP 的 QCPDrawableGraph 也是如此。

文档中明确提到了它。 QPCGraph (Constructor & Destructor Documentation):

The created QCPGraph is automatically registered with the QCustomPlot instance inferred from keyAxis. This QCustomPlot instance takes ownership of the QCPGraph, so do not delete it manually but use QCustomPlot::removePlottable() instead.

作为 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. 即使没有 virtual 关键字,析构函数 ~Derived() 也是 virtual 因为它的基 class Base 的析构函数是。

  2. 首先调用析构函数 ~Derived(),但删除指向基 class Base 的指针。 (这就是虚拟析构函数的目的。)

  3. 所有基础 classes 的析构函数也被调用(以及构造函数,但顺序相反)。