2010-01-19 9 views
5

Devo eliminare oggetti dall'heap nell'esempio seguente? E se si, come?Devo cancellarlo? [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(); 
} 

Grazie per qualsiasi aiuto.

risposta

11

Basta assegnare splitter allo stack. Quindi tree, list e table diventano figli di splitter che diventa proprietario. Quando viene eliminato splitter, tutti i bambini vengono eliminati.

Da Widgets Tutorial - Child Widgets:

Il pulsante è ora un figlio della finestra e saranno cancellati quando la finestra viene distrutto. Nota che nascondere o chiudere la finestra non lo distrugge automaticamente. Sarà distrutto quando l'esempio termina.

Vedere anche Object Trees and Object Ownership.

+0

Dzięki Grzesiek. –

+0

Ma devo eliminare l'oggetto splitter? O lo metto in pila? –

+0

Ah sì, bene metterei lo "splitter" nello stack –

1

Gregory Pakosz ha indicato la soluzione corretta, ma volevo reiterare con un esempio di codice e suggerire di esaminare l'ambito dell'oggetto C++. Greg è preciso, ma non ha chiarito che mettere lo splitter nello stack significa che una volta che sarà fuori dal campo di applicazione (l'applicazione si chiude) verrà eliminato.

Più precisamente, è necessario impostare il genitore di QObject. Quando un oggetto genitore assume la proprietà di un altro oggetto, cancella i suoi figli dopo aver chiamato delete sull'oggetto genitore. Nel caso di QSplitters, addWidget aggiunge al layout di QWidget e il layout diventa proprietario di tali oggetti.

#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(); 
} 

Così semplicemente facendo 'splitter' una variabile locale farà sì che venga eliminato quando si va fuori portata. A sua volta, anche i bambini verranno eliminati.

0

Invece di gestire la memoria manualmente, è possibile lasciare che il compilatore farlo per voi. A quel punto potresti chiedere: perché usare il mucchio del tutto? Dovresti mantenere le cose in base al valore il più possibile, e lasciare che il compilatore faccia il duro lavoro.

Gli oggetti verranno distrutti nell'ordine inverso di dichiarazione. Quindi lo splitter - il genitore implicito - deve essere dichiarato per primo, in modo che non tenti di cancellare erroneamente i suoi figli. In C++, l'ordine delle dichiarazioni ha un significato!

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(); 
}