Pregunta

¿Ya terminé mi primera aplicación Symbian en funcionamiento, pero en mi aprendizaje acelerado he prestado poca atención a la administración de la memoria y a presionar y limpiar la pila?

¿Podría alguien indicarme en la dirección de algunas de las mejores prácticas para usar aquí, y tal vez algunas de las mejores herramientas de detección de fugas / creación de perfiles de memoria.

Por ejemplo, si tomo un TDesC o un TPtrC16 dentro de una función, ¿cómo los limpio de la mejor manera, es simplemente

TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()

..para todo?

Gracias y perdóname, soy un Symbian confeso n00b.

¿Fue útil?

Solución

En el pasado he usado HookLogger de Symbian para rastrear e investigar fugas de memoria. No es el mejor, pero sí ayuda. Además, los marcadores de montón aumentan los pánicos ALLOC en caso de pérdidas de memoria cada vez que sale de su aplicación. La información que proporcionan esos pánicos apenas es útil, pero es una buena indicación de que hay una pérdida de memoria en alguna parte. A partir de ahí, puede usar herramientas como HookLogger para reducir en qué parte del código se está introduciendo la fuga.

Mencioné algunos recursos de Symbian en respuesta a este hilo . Si bien todos estos me han sido más útiles, encontré el libro Manual del desarrollador de Symbian acreditado inmensamente útil. Si pudieras tenerlo en tus manos, definitivamente lo recomendaría. Es una lectura rápida, pero explica los conceptos de manera brillante, incluidas las cosas sobre la administración de memoria y los descriptores.

Otros consejos

Las cosas almacenadas en la pila no necesitan almacenarse en la pila de limpieza (a menos que necesiten un manejo especial (Clases R, etc., ver más abajo))

La pila de limpieza es para eliminar objetos cuando se produce una licencia (pensar excepción), que de lo contrario perdería memoria.

El uso real de la pila de limpieza es a través de las funciones estáticas CleanupStack :: PushL (..) y CleanupStack :: Pop / PopAndDestroy.

Algunas clases como RFile, RFs tienen que cerrarse en lugar de eliminarse, por lo que para estas funciones se llama a su función :: Cerrar, por lo que debe usar la función global CleanupClosePushL (), que en lugar de llamar al operador de eliminación en su objeto en una licencia, llama a la clase ':: Cerrar función en su lugar.

Para verificar si hay pérdidas de memoria en el código, puede usar las macros __UHEAP_MARK; y __UHEAP_MARKEND; lo que verificará que no quede nada en el montón entre estas dos llamadas.

Si deja algo en la pila de limpieza en un CActive's :: RunL, el programador activo entrará en pánico.

Como técnica general, si una función a la que está llamando podría salir (indicada con una 'L'), se debe agregar cualquier signo que deba eliminarse o cerrarse (etc.) pila de limpieza.

Se necesitan un poco menos de 10 páginas para explicar adecuadamente todo lo que necesita saber sobre CleanupStack y la administración de memoria para Symbian C ++.

Plug desvergonzado: este libro fue escrito específicamente para su nivel de n00bness: http://www.quickrecipesonsymbianos.com

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