Question

J'ai à peu près terminé ma première application Symbian opérationnelle, mais dans mon apprentissage accéléré, je me suis peu soucié de la gestion de la mémoire et du nettoyage de la pile?

Quelqu'un pourrait-il m'indiquer les meilleures pratiques à utiliser ici, et peut-être certains des meilleurs outils de détection de fuite / de profilage de mémoire.

Par exemple, si je saisis un TDesC ou un TPtrC16 dans une fonction, comment puis-je alors les nettoyer de la meilleure façon, est-ce simplement

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

.. pour tout?

Merci et s'il vous plaît, pardonnez-moi, je suis un confesseur de soi Symbian n00b.

Était-ce utile?

La solution

Dans le passé, j'ai utilisé HookLogger à partir de Symbian pour tracer et enquêter sur les fuites de mémoire. Ce n'est pas le meilleur, mais ça aide vraiment. De plus, les marqueurs de tas soulèvent la panique ALLOC en cas de fuite de mémoire chaque fois que vous quittez votre application. Les informations fournies par ces paniques sont à peine utiles, mais elles indiquent bien qu'il existe une fuite de mémoire quelque part. À partir de là, vous pouvez utiliser des outils tels que HookLogger pour déterminer dans quelle partie du code la fuite est introduite.

J'ai mentionné quelques ressources Symbian en réponse à ce fil . . Bien que tout cela m’ait été très utile, j’ai trouvé le livre Guide de développeur Symbian accrédité extrêmement utile. Si vous pouviez mettre la main dessus, je le recommanderais certainement. C’est une lecture rapide, mais elle explique brillamment les concepts, y compris en ce qui concerne la gestion de la mémoire et les descripteurs.

Autres conseils

Les objets stockés dans la pile n'ont pas besoin d'être stockés dans la pile de nettoyage (sauf si un traitement spécial est nécessaire (classes R, etc., voir ci-dessous))

La pile de nettoyage sert à supprimer des objets lorsqu’un congé (sauf exception) surviendrait, ce qui sinon provoquerait une fuite de mémoire.

L'utilisation réelle de la pile de nettoyage passe par les fonctions statiques CleanupStack :: PushL (..) et CleanupStack :: Pop / PopAndDestroy.

Certaines classes telles que RFile ou RF doivent fermer plutôt que supprimer. Pour ces fonctions, la fonction :: Close est appelée. Vous devez donc utiliser la fonction globale CleanupClosePushL (), qui au lieu d'appeler l'opérateur de suppression sur votre objet le une permission, elle appelle plutôt la fonction class ':: Close.

Pour vérifier si votre code contient des fuites de mémoire, vous pouvez utiliser les macros __UHEAP_MARK; et __UHEAP_MARKEND; qui vérifiera que rien ne reste sur le tas entre ces deux appels.

Si vous laissez quelque chose sur la pile de nettoyage dans un dossier :: RunL de CActive, le planificateur actif paniquera.

Comme technique générale, si une fonction que vous appelez pouvait quitter (indiquée par un "L" final), alors tout signe devant être supprimé ou fermé (etc.) devrait être ajouté à la liste. pile de nettoyage.

Il faut un peu moins de 10 pages pour expliquer correctement tout ce que vous devez savoir sur le CleanupStack et la gestion de la mémoire pour Symbian C ++.

Plug sans vergogne: ce livre a été écrit spécifiquement pour votre niveau de n00bness: http://www.quickrecipesonsymbianos.com

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top