2010-03-03 12 views
5

Perdón por la pregunta tonta, pero estoy trabajando con Qt y C++ por primera vez, y trabajando en el tutorial y algunas muestras.Gestión de memoria para colecciones de widgets en Qt

Una cosa que se mencionó es que las cosas Qt no necesitan ser eliminadas explícitamente. Por lo tanto, pregunta principal, ¿esto también se aplica a colecciones de cosas Qt? Como decir que quiero un número dinámico de MyWidget s, así que guardo un vector o cualquiera de ellos. ¿Todavía están ocupados por mí?

Como una pregunta complementaria, ¿qué está pasando para que no tenga que preocuparme por los destructores?

Respuesta

5

Qt tiene un modelo de objeto interesante seguro. Cuando comencé, me inquietaba que hubiera tantas llamadas new Foo y no delete s.

http://qt.nokia.com/doc/4.6/object.html Es un buen lugar para comenzar a leer sobre el modelo de objetos.

Cosas de interés: Las subclases de QObject tienen su asignación y los métodos de copia-ctor deshabilitados. QObject mantiene internamente la cadena de objetos child-parents.

Generalmente al crear una instancia de una subclase QObject (si no planea administrar su puntero) proporcionará otro puntero QObject como padre. Este 'padre' asume la gestión del niño que acaba de crear. Puede llamar a setParent() en un QObject para cambiar quién lo "posee". Hay muy pocos métodos en Qt que cambien el elemento primario de un objeto, y todos declaran explícitamente que lo hacen en los documentos.

Para responder a su pregunta específica: depende de cómo haya realizado todas sus instancias de MyWidget.

Si hizo cada una con un padre, entonces no, no tiene que eliminarlas. El padre los eliminará cuando se elimine.

Si mantiene una colección de QList<MyWidget*> y no les dio un padre, entonces debe eliminarlos usted mismo.

7

El modelo de gestión de memoria Qt se basa en una relación padre-hijo. Las clases Qt toman un parent opcional como parámetro de su constructor. La nueva instancia se registra con este elemento primario de manera que se elimina cuando se elimina el elemento primario. Si está utilizando una colección Qt (por ejemplo, QList), creo que puede establecer la lista como principal de sus entradas. Si usa un std :: vector u otro tipo de colección, no obtendrá administración de memoria "automática".

El modelo de Qt tiene mucho sentido en una jerarquía de UI donde coincide uno a uno con la jerarquía de UI. En otros casos, no siempre se correlaciona tan limpiamente y es necesario evaluar si el uso del sistema Qt tiene sentido para la situación particular. Las herramientas normales de C++ aún funcionan: puede usar std :: tr1 :: shared_ptr o cualquiera de las otras clases de punteros inteligentes para ayudarlo a administrar la duración del objeto. Qt también incluye QPointer, un puntero guardado, y el QSharedPointer/QWeakPointer par que implementa un puntero inteligente de cotejo de referencia y un par de referencia débil.

+2

No puede establecer una colección Qt como principal de un objeto. Los objetos que están asignados dinámicamente y tienen relaciones padre-hijo son QObjects y toman las subclases QObjects/QWidgets como padres. QList y las otras clases de colección no heredan de QWidget (y por extensión QObject), por lo que no puede establecerlo como primario. – blwy10

Cuestiones relacionadas