Soy bastante nuevo en Qt y me pregunto algunas cosas básicas con la gestión de la memoria y la vida de los objetos. ¿Cuándo debo eliminar y / o destruir mis objetos? ¿Algo de esto se maneja automáticamente?
En el siguiente ejemplo, ¿cuál de los objetos que creo debo eliminar? ¿Qué sucede con la variable de instancia myOtherClass
cuando myClass
se destruye? ¿Qué sucede si no elimino (o destruyo) mis objetos en absoluto? ¿Será eso un problema de memoria?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Como puede ver, esto es algo bastante fácil para los principiantes, pero ¿dónde puedo aprender sobre esto de una manera fácil?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Esta no es la razón por la que es seguro. En Qt 4.7.4, los hijos de QObject se eliminan directamente (a través dedelete
, consulte qobject.cpp, línea 1955). La razón por la que es seguro eliminar primero los objetos secundarios es que un QObject le dice a su padre que lo olvide cuando se elimina.ClassB
heredaQObject
yClassC
hereda deClassB
, entoncesClassC
la relación padre-hijo de Qt solo destruirá adecuadamente siClassB
el destructor es virtual.Me gustaría extender la respuesta de Debilski señalando que el concepto de propiedad es muy importante en Qt. Cuando la clase A asume la propiedad de la clase B, la clase B se elimina cuando se elimina la clase A. Hay varias situaciones en las que un objeto se convierte en propietario de otro, no solo cuando crea un objeto y especifica su padre.
Por ejemplo:
Otro ejemplo:
Por lo tanto, consulte la documentación con frecuencia, generalmente especifica si un método afectará la propiedad de un objeto.
Como dijo Debilski, estas reglas se aplican ÚNICAMENTE a los objetos que se derivan de QObject. Si su clase no se deriva de QObject, tendrá que manejar la destrucción usted mismo.
fuente
Padre (ya sea el objeto QObject o su clase derivada) tiene una lista de punteros a sus hijos (QObject / su derivado). El padre eliminará todos los objetos de su lista secundaria mientras que el padre se destruye. Puede usar esta propiedad de QObject para hacer que los objetos secundarios se eliminen automáticamente cuando se elimine el padre. La relación se puede establecer usando el siguiente código
Hay otra forma de administrar la memoria en Qt, usando smartpointer. El siguiente artículo describe varios punteros inteligentes en Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
fuente
Para agregar a estas respuestas, para la verificación, le recomendaría que utilice la
Visual Leak Detetor
biblioteca para sus proyectos de Visual c ++, incluidos los proyectos de Qt, ya que está basada en c ++, esta biblioteca es compatible connew, delete, free and malloc
declaraciones, está bien documentada y es fácil de usar. No olvide que cuando crea su propia clase de interfazQDialog
oQWidget
heredada, y luego crea un nuevo objeto de esta clase, no olvide ejecutar lasetAttribute(Qt::WA_DeleteOnClose)
función de su objeto.fuente