[Qt]Wycieki pamięci jak to z nimi jest?

0

Witam
Od pewnego czasu męczą mnie programy w Qt w tutkach nie karzą się przejmować wyciekami pamięci bo niby Qt sam tym jakoś zarządza czy ktoś z was ma większe w tym doświadczenie i może powiedzieć jak to jest do końca?

np. W tym kodzie każą się nie przejmowac wyciekiem.

#include <QApplication>
#include <QLabel>

int main(int ile,char* cmd[])
{
    QApplication app(ile,cmd);
    QLabel* label = new QLabel("Okienko");
    label->show();

    return app.exec();
}

albo np gdy robimy coś takiego


class mojaKlasa : public QWidget
{
public:
   mojaKlasa()
{
QPushButton* guzik = new QPushButton("Guzik");
.. dalej kod
}
};
0

I jak nikt nic nie wie na ten temat? * Przepraszam chyba powinno być w dziale newbie ale w sumie nie ma dobrego wytłumaczenia nigdzie w necie*

Jedyne co znalazłem to to ,że Qt ma mechanizmy które tym się martwią ale taka wypowiedź byle kogo mnie nie satysfakcjonuje. Nawet jeżeli to nie lepiej samemu usunąć to i owo z pamięci?

0

Jest wytłumaczenie, tylko trzeba dobrze zapytać [diabel]

http://lists.trolltech.com/qt-interest/2006-03/msg00798.html

Czyli, jeśli wierzyć panom na tamtym forum:

  • Klasy nie dziedziczące po QObject nie podlegają zarządzaniu
  • QT nie ma własnego garbage collectora (btw. to było właśnie słowo klucz ok które należało zapytać) - jeśli zaalokujesz pamięć dla jakiegoś komponentu to nie zostanie ona magicznie zwolniona sama z siebie).
  • Ale każda kontrolka sprząta po sobie - czyli jeśli usuniesz/zostanie zamknięte okno to posprząta po sobie samo.
  • Nie jestem pewien co pan z posta 3 w wątku chciał przekazać, ale doczytaj co dokładnie się dzieje w przypadku Qt 4 i dalej (z tego co rozumiem trzeba wywołać qDeleteAll żeby usunąć dzieci)
  • Usuwane są tylko potomki - jeśli stworzysz obiekt najwyższego poziomu musisz się sam o niego zatroszczyć
0

Zaraz poczytam sobie dzięki wielkie za linka ale stwierdzam ze chyba łatwiej będzie samemu usuwać wszystko zamiast raz się pomylić bo coś się pomieszało ;)

EDIT

Można usuwać null pointery? nie wysypie się przez to program?
np,
int* wsk = 0;
delete wsk; //mi sie nie wysypuje program :P

0

Poznaj QPointer, powinno pomóc.

0

Dzięki wielkie
PS. Nie lubię się tak uczyć coś jest i to mam wiedzieć lobię mieć wytłumaczone jak i dlaczego :)

0

To wszystko sprowadza się do zarządzania własnością. Każdemu QObject (więc i QWidget) podczas konstrukcji można podać właściciela-rodzica odpowiedzialnego za usunięcie obiektu. W ten sposób powstaje drzewo, w którym "obcięcie" jednej "gałęzi" powoduje usunięcie tej "gałęzi" razem ze wszystkimi "liśćmi". Wszystko co nie ma ustawionego parent-a musi być usunięte ręcznie lub półrocznie (deleteLater - które jest slotem)!

0

Trochę QPointer mało mi wyjaśnił :) ale dzięki i tak za odp i innych za odpowiadanie :)

A to co napisał Marek to dodatkowo wyczytałem ,że QObject ma listę swoich dzieci i potem ta "gałąź" jest odcinana :)

A umiał by ktoś napisać prosty przykład takiej klasy QObject chodzi mi o to aby pokazać jak to dokładnie działa usuwanie dzieci :). Oczywiście jak komuś się chce będę bardzo wdzięczny :)

//Edit
Jeszcze jedno
Rozumiem ,że destruktor najwyższego okna jest wywołany jak obiekt jest na stosie ale nie rozumiem jak on ma być wywołany jak jest na stercie?
np.

#include <QApplication>
#include "moja_klasa_dziedziczaca_zQObject.h"
int main(int ile,char* cmd[])
{
QApplication app(ile,cmd);
MojaKlasa okno = new MojaKlasa;
okno->show()
return app.exec();
}

Tak jak w tym wypadku no chyba ,że to jest jakoś powiązane z QApplication?

0

QPointer jest wskaźnikiem słabym. On różni się tym od zwykłego wskaźnika, że się automatycznie zeruje w wypadku, gdy element docelowy został usunięty. QPointer nie odpowiada za własność obiektu, ma byś jedynie "świadomy" istnienia lub "śmierci" jakiegoś QObject'u.

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