Usuwanie niepotrzebnych obiektów --jak?-- cpp/Qt

0

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ć ?)

0
  1. Na 100% wszystkie obiekty generowane za pomoca designera, sa usuwane wraz ze smiercia obiektu formy.
  2. Z tego co pamietam, Qt zarzadza obiektami na zasadzie rodzic/dziecko i kiedy rodzic umrze, to wszystkie dzieci rowniez.
  3. Jesli recznie tworzysz obiekty to musisz je tez recznie zniszczyc (za wyjatkiem punktu 2., ale tego nie jestem pewien).
0

@n0name_l - Dzięki za odpowiedź, zostałem utwierdzony w swoich domniemaniach, ale..

chciałbym wrócić do takiego przykładu:

 
void PersonControllerClass:Panel()
{
       ui->button->setText("Hello");

       QMessageBox * MsgBox = new QMessageBox();
       MsgBox->setText("Hi");

}

to usuwając obiekt klasy PersonControllerClass, obiekt buttona będzie usunięty bo jest utworzony pod designerem (ui), a co z obiektem QMessageBox ? (muszę dodatkowo w destruktorze klasy dopisać delete MsgBox ?)

ps. I jeszcze jedno - zamykając całą aplikacje wszystkie obiekty zostają "z przymusu" usunięte ?

0

ps. I jeszcze jedno - zamykając całą aplikacje wszystkie obiekty zostają "z przymusu" usunięte ?

Rycerz jadąc na koniu piana leciała mu z pyska.

Cała pamięć programu po jego zamknięciu jest zwalniana przez system operacyjny.
Mimo to wypada ręcznie zwalniać w kodzie to co trzeba zwolnić, dla samej zasady.

0

Juz napisalem wszystkie mozliwe przypadki stworzenia obiektu w Qt i co sie dzieje z pamiecia wtedy.
Jesli mi nie wierzysz / nie lubisz mnie / badz nie lubisz czytac po polsku, prosze: http://stackoverflow.com/questions/2491707/memory-management-in-qt
Przeczytaj pierwsza odpowiedz + komentarze, tam jest to ciut szerzej opisane i na czym to polega.

1 użytkowników online, w tym zalogowanych: 0, gości: 1