2012-09-20 7 views
6

Zgodnie z dokumentacją Qt:Czy QObject rozróżnia między dziećmi przydzielonymi do stosu i sterty podczas usuwania?

QObjects organizowania się w obiektowych drzew. Po utworzeniu obiektu QObject z innym obiektem jako obiektem nadrzędnym obiekt automatycznie doda się do listy dzieci podrzędnych(). Jednostka nadrzędna przejmuje na własność obiekt ; tj. automatycznie usunie swoje dzieci z destruktora .

Dla mnie, który oznacza, że ​​QObject jest usuwany, przechodzi i wywołuje delete na wszystkich wskaźnikach, które przechowuje na swojej liście dzieci.

Jednak nie jest konieczne, aby dzieci były dynamicznie przydzielane, a tworzenie drzew QObject z obiektami przydzielonymi do stosu jest całkowicie legalne.

Zgodnie ze standardową specyfikacją, wywoływanie delete na wskaźniku, który nie wskazuje na dynamicznie przydzielany obiekt, jest niezdefiniowanym zachowaniem, które może spowodować wszystko, od "niczego" do awarii programu.

IMO jest mało prawdopodobne w przypadku QObject, który jest niemal szkieletem niemal całego zbioru klas Qt, aby polegać na czymś, co może powodować niezdefiniowane zachowanie.

A więc, czy QObject rozróżnia między kasami alokowanymi przez stos i stertę podczas usuwania? A jeśli tak, to jak dokładnie?

Odpowiedz

9

jednak nie jest to konieczne dla dzieci mają być przydzielane dynamicznie, i jest to całkowicie legalne wybudować QObject drzewa z stos przydzielone obiektów.

No. Zobacz QObject::~QObject():

Ostrzeżenie: Wszystkie obiekty podrzędne są usuwane. Jeśli którykolwiek z tych obiektów znajduje się na stosie lub globalnym, prędzej czy później twój program ulegnie awarii.

+2

Tak, powinna wziąć spojrzeć na destructor przed pytaniem całego ... 10x – dtech

+0

Niektóre interesujące pokrewne: Przeznaczyć QObjects korzeniowych w stosie; wszystko inne (dzieci) na kupce https://stackoverflow.com/questions/19331396/how-does-qt-delete-objects-and-hach-is-the-best-way-to-store-qobjects?rq= 1 –

Powiązane problemy