Recientemente he comenzado a investigar Qt para mí mismo y tienen la siguiente pregunta: ¿¿Cómo funciona C++/Qt - La asignación de memoria?
Supongamos que tengo un poco de QTreeWidget* widget
. En algún momento quiero añadir algunos elementos a la misma y esto se hace a través de la siguiente llamada:
QList<QTreeWidgetItem*> items;
// Prepare the items
QTreeWidgetItem* item1 = new QTreeWidgetItem(...);
QTreeWidgetItem* item2 = new QTreeWidgetItem(...);
items.append(item1);
items.append(item2);
widget->addTopLevelItems(items);
Hasta ahora parece bien, pero que en realidad no entiendo quién debe controlar la vida de los objetos. Debo explicar esto con un ejemplo :
Digamos, otra función llama widget->clear();
. No sé qué sucede debajo de esta llamada, pero creo que la memoria asignada para item1
y item2
no se elimina aquí, ya que su propietario no se transfirió en realidad. Y, bang, tenemos una pérdida de memoria.
La pregunta es la siguiente - hace Qt
tiene algo que ofrecer para este tipo de situación? que podría utilizar boost::shared_ptr
o cualquier otro puntero inteligente y escribir algo como
shared_ptr<QTreeWidgetItem> ptr(new QTreeWidgetItem(...));
items.append(ptr.get());
pero no sé si el propio Qt trataría de hacer explícitas delete
llamadas en mi punteros (lo cual sería desastroso desde que los declaro como shared_ptr
-managed).
¿Cómo resolvería este problema? Quizás todo sea evidente y extraño algo realmente simple?
M. Entonces, si "enlace" * mis elementos hijo al widget principal mientras escribe, ¿puedo estar seguro de que una llamada 'clear()', por ejemplo, eliminaría esa memoria? –
Sí, puedes. Mientras utilice la gestión de memoria de Qt, Qt se asegura de que todos los objetos se eliminen cuando se elimine su elemento primario (por lo que Qt funciona estrictamente basado en árbol con respecto a la gestión de memoria padre-hijo. – theDmi
Si utiliza el complemento() o addWidget () o funciones similares, no configura explícitamente el padre en el constructor, aunque nunca duele. – rubenvb