2010-08-05 10 views
5

Viniendo del mundo de Symbian, estoy acostumbrado a usar el montón tanto como sea posible para evitar que se quede sin espacio en la pila, especialmente cuando se manejan descriptores. Las clases derivadas de CBase siempre se asignaron dinámicamente en el montón, ya que si no lo fueran, sus variables miembro no se inicializarían. ¿Se aplica la misma convención a las clases derivadas de QObject?¿Las clases derivadas no QObject "siempre" deben colocarse en la pila?

En Qt parece ser común poner, por ejemplo QString, en la pila. ¿El contenido de la cadena se pone en el montón mientras QString actúa como un contenedor en la pila, o todo se pone en la pila?

Respuesta

10

Como sje397 dijo: Es idiomático poner QString y contenedores en la pila, ya que están implícitamente compartidos. Sus partes internas (puntero "d" de idiform idiom) se crean en el montón. No tiene sentido crear también el objeto en el montón. Solo causa molestias de administración de memoria y usted pierde las propiedades de escritura por escritura cuando pasa punteros a cadenas/contenedores.

QObjects, por otro lado, desea crear en el montón en casi todos los casos, ya que de lo contrario serían destruidos de nuevo de inmediato. No se pueden copiar ni asignar (bueno, uno puede aplicarlo para las subclases propias, pero la semántica QObject está rota entonces), y generalmente se supone que sobreviven al cuerpo del método en el que se crearon. La excepción es QDialog, que es a menudo creado en la pila, seguido de QDialog::exec, que bloquea hasta que se cierra el cuadro de diálogo. Pero incluso eso es estrictamente hablado inseguro, ya que los eventos externos (llamadas RPC, operaciones en segundo plano) podrían hacer que el cuadro de diálogo sea eliminado por su padre (si el padre mismo se elimina) antes de que regrese el ejecutivo. Luego tener el cuadro de diálogo creado en la pila causará la eliminación doble al desenrollar la pila -> bloqueo.

+0

Gracias por la amplia respuesta. Eso, junto con el enlace de sje397 aclararon mi confusión. – fejd

1

QString, y muchas otras clases de Qt, usan implicit data sharing. Eso implica que la memoria generalmente se asigna en el montón.

Cuestiones relacionadas