正确分配和释放子类 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()
备注:
即使没有 virtual
关键字,析构函数 ~Derived()
也是 virtual
因为它的基 class Base
的析构函数是。
首先调用析构函数 ~Derived()
,但删除指向基 class Base
的指针。 (这就是虚拟析构函数的目的。)
所有基础 classes 的析构函数也被调用(以及构造函数,但顺序相反)。
我正在使用 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()
备注:
即使没有
virtual
关键字,析构函数~Derived()
也是virtual
因为它的基 classBase
的析构函数是。首先调用析构函数
~Derived()
,但删除指向基 classBase
的指针。 (这就是虚拟析构函数的目的。)所有基础 classes 的析构函数也被调用(以及构造函数,但顺序相反)。