gpt4 book ai didi

c++ - 正确分配和释放子类 QCPGraph

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:59 26 4
gpt4 key购买 nike

我正在使用 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 的析构函数最后是否仍然负责解除分配?

最佳答案

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 因为它的基类 的析构函数基础是。

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

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

关于c++ - 正确分配和释放子类 QCPGraph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com