2010-01-19 16 views
5

Czy muszę usunąć obiekty ze sterty w poniższym przykładzie? A jeśli tak, to w jaki sposób?Czy muszę to usunąć? [Qt]

#include <QApplication> 
#include <QTreeView> 
#include <QListView> 
#include <QTableView> 
#include <QSplitter> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc,argv); 
    QTreeView* tree = new QTreeView; 
    QListView* list = new QListView; 
    QTableView* table = new QTableView; 
    QSplitter* splitter = new QSplitter; 
    splitter->addWidget(tree); 
    splitter->addWidget(list); 
    splitter->addWidget(table); 
    splitter->show(); 
// delete splitter; WHEN TRYING TO DELETE I'M GETTING INFO THAT app EXITED 
// delete table; WITH CODE -1073741819 
// delete list; 
// delete tree; 
    return app.exec(); 
} 

Dziękuję za pomoc.

Odpowiedz

11

Wystarczy przydzielić splitter na stosie. Następnie tree, list i table stają się potomkami splitter, które przejmują własność. Po usunięciu splitter wszystkie dzieci zostaną usunięte.

Od Widgets Tutorial - Child Widgets:

Przycisk jest teraz dziecko przez okno i zostaną usunięte, gdy okno jest zniszczona. Zauważ, że ukrywanie lub zamykanie okna nie powoduje jego automatycznego zniszczenia. Zostanie zniszczony po opuszczeniu przykładu.

Zobacz także Object Trees and Object Ownership.

+0

Dzięki Grzesiek. –

+0

Ale czy muszę usunąć obiekt splittera? Czy mogę umieścić go na stosie? –

+0

Ah tak, cóż, umieściłbym "splitter" na stosie –

1

Gregory Pakosz wskazał właściwe rozwiązanie, ale chciałem powtórzyć za pomocą przykładu kodu i zasugerować, aby przyjrzeć się zakresowi obiektów C++. Greg jest dokładny, ale nie wyjaśnił, że umieszczenie splittera na stosie oznacza, że ​​gdy wyjdzie poza zasięg (aplikacja wyjdzie), zostanie ona usunięta.

Dokładniej powinieneś ustawić rodzica QObject. Kiedy obiekt nadrzędny przejmuje własność innego obiektu, usuwa jego elementy podrzędne przy wywołaniu delete na obiekcie nadrzędnym. W przypadku QSplitters addWidget dodaje do układu QWidget, a układ przejmuje własność tych obiektów.

#include <QApplication> 
#include <QTreeView> 
#include <QListView> 
#include <QTableView> 
#include <QSplitter> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc,argv); 

    QTreeView* tree = new QTreeView; 
    QListView* list = new QListView; 
    QTableView* table = new QTableView; 

    QSplitter splitter; 

    splitter.addWidget(tree); 
    splitter.addWidget(list); 
    splitter.addWidget(table); 
    splitter.show(); 

    return app.exec(); 
} 

Więc po prostu co „splitter” zmiennej lokalnej spowoduje ono zostać usunięte, jeśli wykracza poza zakres. Z kolei dzieci zostaną również usunięte.

0

Zamiast ręcznego zarządzania pamięć, można pozwolić kompilator zrobi to za Ciebie. W tym momencie możesz zapytać: po co w ogóle używać sterty? Powinieneś utrzymywać rzeczy według wartości tak bardzo, jak to możliwe, i pozwolić kompilatorowi na ciężką pracę.

Obiekty zostaną zniszczone w kolejności odwrotnej do deklaracji. Zatem splitter - domyślny rodzic - musi zostać zadeklarowany jako pierwszy, aby nie próbował niepoprawnie usuwać swoich dzieci. W C++ kolejność deklaracji ma znaczenie!

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc,argv); 
    QSplitter splitter; 
    QTreeView tree; 
    QListView list; 
    QTableView table; 
    splitter.addWidget(&tree); 
    splitter.addWidget(&list); 
    splitter.addWidget(&table); 
    splitter.show(); 
    return app.exec(); 
} 
Powiązane problemy