2012-09-20 18 views
6

De acuerdo con la documentación de Qt:¿QObject distingue entre pila y montón de hijos asignados al eliminar?

QObjects se organizan en árboles de objetos. Cuando crea un QObject con otro objeto como principal, el objeto se agregará automáticamente a en la lista hijos() de los padres(). El padre toma la propiedad del objeto; es decir, eliminará automáticamente sus hijos en su destructor .

Para mí, eso implica que cuando se elimina un QObject, se transfiere y se llama a eliminar en todos los punteros que almacena en su lista de elementos secundarios.

Sin embargo, no es necesario que los niños se asignen dinámicamente, y es perfectamente legal construir árboles de QObject con objetos asignados de pila.

De acuerdo con las especificaciones estándar, llamar a eliminar en un puntero que no apunta a un objeto dinámicamente asignado es un comportamiento indefinido, que puede resultar en cualquier cosa, desde "nada" hasta un bloqueo del programa.

IMO es poco probable que QObject, que es prácticamente la columna vertebral de la casi totalidad de la colección de clases Qt, confíe en algo que podría producir un comportamiento indefinido.

Entonces, ¿distingue QObject entre los hijos asignados de pila y montón al eliminar? Y si es así, ¿cómo exactamente?

Respuesta

9

Sin embargo, no es necesario que los niños sean asignados dinámicamente, y es perfectamente legal para construir árboles QObject con la pila asignado objetos.

Nº Ver QObject::~QObject():

Advertencia: Todos los objetos secundarios se eliminan. Si alguno de estos objetos está en la pila o global, tarde o temprano su programa se bloqueará.

+2

Sí, debería haber echado un vistazo al destructor antes de preguntar sobre ... 10x – dtech

+0

Algunos temas interesantes relacionados: Asigne QObjects raíz en la pila; todo lo demás (niños) en el montón https://stackoverflow.com/questions/19331396/how-does-qt-delete-objects-and-what-is-the-best-way-to-store-qobjects?rq= 1 –

Cuestiones relacionadas