2010-02-04 11 views
5

Vengo de un fondo C bastante fuerte, y tengo una base bastante sólida en C++. Más recientemente, he estado trabajando con C# y otros lenguajes de nivel superior. Un proyecto en el que estoy trabajando podría realmente beneficiarse del uso de QT4, pero tengo algunas preguntas sobre la administración de la memoria que parece que no entiendo. He leído la documentación de QT4 y no me ha ayudado mucho. Entonces esa es la razón por la que estoy aquí.QT4 Memory Management

1) Bueno por lo que, para empezar, entiendo que la forma más fácil de usar objetos QT4 es declarar de forma local:

void MyFunc() 
{ 
    QString foo; 
    // do stuff to foo 

} 

Esto es bastante simple, que puede tomar ese objeto, y pasarlo alrededor y saber que cuando se salga del alcance será destruido. Pero esta es mi pregunta.

1) Si creo una QList y agrego objetos a ella, y luego la QList sale del alcance, ¿intentará desasignar los objetos secundarios?

2) Si una rutina QT4 devuelve un puntero a un objeto, ¿soy entonces responsable de la desasignación de ese objeto?

3) Si creo una subclase de un QWidget y lo agrego a QWindow, ¿cómo puedo asegurar que cuando se destruya QWindow, que lleve mi widget con él?

Gracias por la ayuda.

+0

Algunas de sus respuestas se encuentran en Propiedad del objeto doc: http://cep.xor.aps.anl.gov/software/qt4-x11-4.2.2/objecttrees.html. –

Respuesta

13

Si creo un QList y añadir objetos a la misma, y ​​luego el QList sale del ámbito, va a tratar de anular la planificación de los objetos secundarios?

QList es como std :: list. Destruirá los objetos contenidos cuando se destruya.

Si una rutina Qt4 devuelve un puntero a un objeto, ¿soy entonces responsable de la desasignación de ese objeto?

Normalmente no, los documentos deben especificar lo que sucede. Una excepción son las funciones take * (por ejemplo, QTableWidget :: takeItem).

Si creo una subclase de un QWidget y lo agrego a una QWindow, ¿cómo puedo asegurar que cuando se destruya QWindow, que lleve mi widget con él?

Depende de cómo se crea el objeto de la subclase.

  • Puede agregarlo como miembro del widget de ventana (no hay QWindow, por cierto) y se destruirá como cualquier variable miembro.
  • Puede asignarlo como nuevo y pasarlo a la ventana como principal y se eliminará gracias a la implementación del árbol de objetos Qt (como se menciona en el pastel)
  • Usted mismo puede gestionar la memoria.

Cuando un QWidget (o cualquier QObject) se destruye, se eliminará de la lista en sí, para borrar de su padre para que pueda eliminar por sí mismo y no preocuparse por eliminaciones dobles.

1

La respuesta es la relación de objeto principal/secundario que existe en Qt. Cuando un objeto principal queda fuera del alcance, o se destruye por cualquier otro medio, Qt garantiza que se destruyan todos sus objetos secundarios.

Más acerca de este comportamiento se puede encontrar aquí ->http://doc.trolltech.com/4.4/objecttrees.html

2

Es posible que desee comenzar aquí: Object Trees ya que esto explica la relación padre/hijo que usa Qt (y todos los otros enlaces dados hasta ahora están desactualizados o de terceros).

1) Si creo una QList y agrego objetos a ella, y luego la QList sale del alcance, ¿intentará desasignar los objetos secundarios?

Sí, se comporta como std :: list. Al igual que std :: list, solo desasignará y no eliminará. Aquí es donde algunos de los Qt pointer classes ser útil

2) Si una rutina QT4 devuelve un puntero a un objeto, pues soy yo responsable de la desasignación de ese objeto?

Como dijo rpg, generalmente no, pero si usted es la documentación lo dirá.

3) Si creo una subclase de un QWidget y lo agrego a una QWindow, ¿cómo puedo asegurar que cuando se destruya la QWindow, que lleve mi widget con ella?

Cuando cree su subclase, asegúrese de utilizar el parámetro principal en el ctor. De esta forma, el objeto será eliminado por Qt. Si es necesario, puede configurar el padre después con QObject::setParent (QObject * parent).