Domanda

Ho praticamente finito la mia prima applicazione Symbian funzionante, ma nel mio apprendimento accelerato ho prestato poca attenzione alla gestione della memoria e spingendo e ripulendo lo stack?

Qualcuno potrebbe indicarmi la direzione di alcune delle migliori pratiche da utilizzare qui e forse alcuni dei migliori strumenti di rilevamento delle perdite / profilazione della memoria.

Ad esempio, se afferro un TDesC o un TPtrC16 all'interno di una funzione, come posso quindi ripulirli nel modo migliore, è semplicemente

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

..per tutto?

Grazie e per favore perdonami, sono un Symbian n00b confessato da me.

È stato utile?

Soluzione

In passato ho usato HookLogger di Symbian per tracciare e indagare sulle perdite di memoria. Non è il migliore, ma sicuramente aiuta. Inoltre, i marker di heap aumentano il panico ALLOC in caso di perdite di memoria ogni volta che si esce dall'applicazione. Le informazioni fornite da quei panici sono a mala pena utili, ma è una buona indicazione che da qualche parte c'è una perdita di memoria. Da lì, puoi usare strumenti come HookLogger per restringere in quale parte del codice viene introdotta la perdita.

Ho citato alcune risorse Symbian in risposta a questa discussione . Mentre tutti quelli sono stati molto utili per me, ho trovato il libro Accredited Symbian Developer Primer immensamente utile. Se ci riuscissi, lo consiglierei sicuramente. È una lettura veloce, ma spiega brillantemente i concetti, comprese le cose sulla gestione della memoria e sui descrittori.

Altri suggerimenti

Le cose archiviate nello stack non devono essere archiviate nello stack di cleanup (a meno che non richiedano una gestione speciale (Classi R, ecc., vedi sotto))

Lo stack di pulizia serve per eliminare gli oggetti quando si verifica un congedo (si pensi all'eccezione), che altrimenti perderebbe memoria.

L'uso effettivo dello stack di cleanup avviene tramite le funzioni statiche CleanupStack :: PushL (..) e CleanupStack :: Pop / PopAndDestroy.

Alcune classi come RFile, RF devono chiudere piuttosto che eliminare, quindi per queste funzioni hanno la loro funzione :: Close chiamata quindi dovresti usare la funzione globale CleanupClosePushL (), che invece di chiamare l'operatore delete sul tuo oggetto su un congedo, chiama invece la funzione ':: Close'.

Per verificare la presenza di perdite di memoria nel codice, è possibile utilizzare le macro __UHEAP_MARK; e __UHEAP_MARKEND; che verificherà che non sia rimasto nulla sull'heap tra queste due chiamate.

Se lasci qualcosa sul cleanupstack in un CActive's :: RunL, lo scheduler attivo andrà in panico.

Come tecnica generale, se una funzione che stai chiamando potrebbe andarsene, (indicata da una 'L' finale), allora qualsiasi segno che deve essere eliminato o chiuso (ecc.) dovrebbe essere aggiunto al stack di pulizia.

Bastano poco meno di 10 pagine per eliminare correttamente tutto ciò che devi sapere sulla gestione di CleanupStack e Memory per Symbian C ++.

Plug spudorato: questo libro è stato scritto appositamente per il tuo livello di n00bness: http://www.quickrecipesonsymbianos.com

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top