Как динамическое выделение памяти в дочерних классах обрабатывается в Qt? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь понять, как Qt обрабатывает создаваемые объекты своих виджетов, которые используют динамическое выделение памяти в пользовательских классах.

Ниже вы можете увидеть main.cpp и часть пользовательского класса " Foo ", который происходит из примеров проектов установки Qt.
Как новичок, я знаю, что всякий раз, когда мы выделяем динамическую память, мы должны видеть delete также где-то в коде. Вопрос в том, где такие delete, чтобы удалить динамическую память, выделенную в Foo.cpp в нижней строке?
QChartView *mychart= new QChartView();

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow window;
    Foo *myobj = new Foo();
    window.setCentralWidget(myobj);
    window.resize(900, 600);
    window.show();
    return a.exec();
}

foo.cpp

Foo::Foo(QWidget *parent) :
    QWidget(parent)
{
    QChartView *mychart= new QChartView();
...

1 Ответ

0 голосов
/ 23 апреля 2019
  1. Родительские классы не обрабатывают своих детей.Классы обрабатывают объект, которым они владеют .Любые динамически размещенные объекты , принадлежащие Foo, должны быть очищены в Foo::~Foo().
  2. Аналогично, динамически размещенные объекты , принадлежащие QMainWindow, очищаются вдеструктор QMainWindow.Когда вы звоните window.setCentralWidget(myobj), вы передаете право владения всем, на что указывает myobj - window, поэтому, когда window уничтожается, он удаляет этот объект в своем деструкторе.Это в свою очередь приводит к тому, что динамически распределяемые объекты , принадлежащие , объекту, на который указывает myobj, подлежат очистке (см. Стр. 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...