Tak jak tytuł tematu podpowiada, chciałbym zapytać się Was w kwestii zarządzania pamięcią w C++/Qt
Temat ten zawsze był dla mnie kłopotliwy (trudny?) pewnie dlatego, że programista ze mnie żaden (przynajmniej tak bym siebie nie nazwał), w dodatku zazwyczaj styczność miałem z C# i Javą, a tam jak wiadomo jest garbage collection i problem ze zwalnianiem pamięcie praktycznie nie obowiązuje..
Ale przechodząc do meritum..
Chciałbym odnieść się do przykładu przedstawiongo na screenie (załącznik).. i do poniższego kodu..
Kod (fragmenty):
//PersonControllerClass
void PersonControllerClass:Panel()
{
RightController = new PersonControlPanelClass(DB);
horizontaalLayout_Right->addWidget(RightController);
RightController->show();
connect(RightController,SIGNAL(SignalAddPersonButton()),this,SLOT(SlotCreateAddPersonForm()));
}
void PersonControllerClass::SlotCreateAddPersonForm()
{
PersonControlAddClass * PersonAddForm = new PersonControlAddClass(DB);
horizontalLayout_Right->addWidget(PersonAddForm);
PersonAddForm->show();
connect(PersonAddForm,SIGNAL(SignalBackToPanel()),this,SLOT(SlotShowPanel()));
}
//PersonControlAddClass
void PersonControlAddClass::SlotBackToPanel() //przycisk powrotu
{
this->close();
this->deleteLater();
emit SignalBackToPanel();
}
Czyli po wybraniu z menu jakiego przycisku (PersonControlPanelClass->QButton), aktualny QWidget powinien zostać usunięty, a w jego miejscie ma pojawić się nowe menu (nowy QWidget PersonControlAddClass) z innymi przyciskami przeznaczonymi dla tego menu.
I teraz rozumiem, że po obiekcie klasy PersonControlPanelClass trzeba posprzątać, bo przy powrocie z obiektu klasy PersonControlAddClass obiekt z panelem zostanie utworzony na nowo..
Tylko jak to powinno wyglądać od strony kodu ?
Ogólnie próbowałem coś pokombinować (jak widać powyżej) z metodą deleteLater(), ale nie wiem czy taka jest idea tej metody..
Ponadto chciałbym się zapytać jak to jest z tym zwalnianiem pamięci w Qt. Bo z tego co wiem i wyczytałem to każda klasa posiadająca GUI posiada destruktor typu:
PersonControlAddClass::~PersonControlAddClass()
{
delete ui;
}
-
I teraz nie wiem jak to rozumieć.. Czy wraz z usunięciem obieku klasy PersonControlAddClass wszystkie elementu znajdującie się "pod opieką" ui, czyli np. ui->button1; ui->editline; etc.. będą automatycznie usunięte ?
-
A co z obiektami które np. są tworzone w konstruktorze ale w "normalny" sposób: QMessageBox * MsgBox = new QMessageBox(); -- czy takie obiekty muszę być już usuwanie osobno, "ręcznie" ? np. w destruktorze tej klasy?
Podsumowując: czekam na rady jak sobie poradzić z zarządzaniem pamięcią w przedstawionych powyżej przypadkach..
I jeszcze jedno - jak najlepiej weryfikować czy dany obiekt został już usunięty ? (jak to najprościej śledzić ?)