Pregunta

Desde el mundo Symbian, estoy acostumbrado a utilizar el montón lo más posible para evitar quedarse sin espacio de pila, especialmente cuando el manejo de los descriptores. CBase clases derivadas siempre se asignan dinámicamente en el montón, ya que si no fuera así, sus variables miembro permanecerían sin inicializar. ¿Se aplica la misma convención de clases derivadas de QObject?

En Qt que parece ser común para poner, por ejemplo QString, en la pila. Son los contenidos de la cadena puestas en el montón mientras QString actúa como un contenedor en la pila, o lo es todo a la pila?

¿Fue útil?

Solución

Como sje397 dijo: Es idiomática para poner QString y contenedores en la pila, ya que se comparten de forma implícita. Sus elementos internos (pimpl modismo "d" puntero) se crean en el montón. No hay ningún punto en la creación del propio objeto en el montón, también. Causas justas problemas de gestión de memoria y se pierden las propiedades destinadas copia en escritura al pasar punteros a cadenas / contenedores alrededor.

QObjects por el contrario desea crear en el montón en casi todos los casos, ya que de otro modo serían destruidos otra vez de inmediato. No pueden ser copiados o asignados (bueno, uno puede cumplir por propias subclases, pero la semántica QObject se rompen a continuación), y por lo general se supone que deben sobrevivir el cuerpo del método que se crean en. Excepción es QDialog, que a menudo se crea en la pila, seguido por QDialog::exec, que bloquea hasta que el diálogo se cierra. Pero incluso eso está estrictamente habla insegura, como eventos externos (llamadas RPC, operaciones de fondo) pueden hacer que el diálogo para borrar por su padre (si se elimina la matriz misma) antes del regreso de Exec. Luego tener el diálogo creado en la pila provocará deleción doble al desenrollar la pila -> accidente.

Otros consejos

QString, y muchas otras clases de Qt, utilice implícita intercambio de datos . Eso implica que la memoria se asignan generalmente en el montón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top