Общая концепция управления памятью QWidget
заключается в том, что родительские виджеты заботятся об удалении дочерних элементов, если они удаляются сами.
A QWidget
становится дочерним по отношению к другому, если родительский элемент задан в конструкторе (почти каждый конструктор виджета предлагает родительский указатель) или дочерний элемент добавлен в родительский виджет.
Это касается и ОП QCPDrawableGraph
.
Это явно упоминается в документе. из QPCGraph
( Документация конструктора и деструктора ):
Созданный QCPGraph автоматически регистрируется с экземпляром QCustomPlot , выведенным из keyAxis . Этот QCustomPlot становится владельцем QCPGraph , поэтому не удаляйте его вручную, а используйте вместо него QCustomPlot :: removePlottable () .
Как конструктор ОП 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()
Демонстрация в реальном времени на ideone
Примечания:
Деструктор ~Derived()
равен virtual
даже без ключевого слова virtual
, поскольку деструктор его базового класса Base
равен.
Деструктор ~Derived()
вызывается первым, хотя путем удаления указателя на базовый класс Base
. (Это намерение виртуальных деструкторов.)
Деструкторы всех базовых классов также называются (как и конструкторы, но в обратном порядке).