2010-01-19 10 views
5

¿Debo eliminar objetos del montón en el siguiente ejemplo? Y si es así, ¿cómo?¿Debo eliminarlo? [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(); 
} 

Gracias por cualquier ayuda.

Respuesta

11

Sólo asignar splitter en la pila. Entonces tree, list y table ser hijos de splitter que tiene la propiedad. Cuando se elimina splitter, se eliminan todos los elementos secundarios.

De Widgets Tutorial - Child Widgets:

El botón es ahora un niño de la ventana y se eliminará cuando se destruye la ventana. Tenga en cuenta que ocultar o cerrar la ventana no la destruye automáticamente. Se destruirá cuando el ejemplo salga.

Véase también Object Trees and Object Ownership.

+0

Dzięki Grzesiek. –

+0

¿Pero tengo que eliminar el objeto del divisor? ¿O debo colocarlo en la pila? –

+0

Ah sí, también me gustaría poner el 'splitter' en la pila –

1

Gregory Pakosz señaló la solución adecuada, pero quería reiterar con un ejemplo de código y sugerir se mira en objeto de C++ alcance. Greg es preciso, pero no aclaró que poner el divisor en la pila significa que una vez que se sale del alcance (la aplicación sale) se eliminará.

Más exactamente se debe configurar el padre de un QObject. Cuando un objeto principal toma posesión de otro objeto, lo elimina al invocar delete en el objeto principal. En el caso de QSplitters, addWidget se agrega al diseño de QWidget y el diseño toma posesión de esos objetos.

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

Así que simplemente haciendo 'splitter' una variable local hará que se elimine cuando se sale del alcance. A su vez, sus hijos también serán eliminados.

0

En lugar de administrar la memoria de forma manual, puede dejar que el compilador lo haga por usted. En ese momento, puede preguntar: ¿por qué utilizar el montón? Debe mantener las cosas por valor tanto como sea posible, y dejar que el compilador haga el trabajo duro.

Los objetos serán destruidos en el orden inverso de la declaración. Por lo tanto, el divisor, el padre implícito, debe declararse primero, para que no intente eliminar incorrectamente sus elementos secundarios. En C++, ¡el orden de las declaraciones tiene un significado!

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