我正在使用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
的析构函数是否仍然可以解决最后的分配问题?
答案 0 :(得分:1)
QWidget
的内存管理的一般概念是,父小部件会在删除子级时关心删除子级。
如果QWidget
成为另一个的子代,则要么在构造器中指定了父代(几乎每个小部件构造器都提供了一个父指针),要么将该子代添加到了父代小部件。
OP的QCPDrawableGraph
也是如此。
在文档中明确提到。的QPCGraph
(Constructor & 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()
注释:
析构函数~Derived()
是virtual
,即使没有virtual
关键字,因为其基类Base
的析构函数也是。
尽管通过删除指向基类~Derived()
的指针,但析构函数Base
被首先调用。 (这是虚拟析构函数的目的。)
还调用了所有基类的析构函数(以及构造函数,但顺序相反)。