2011-08-22 6 views
1

Je ne suis pas très familier avec la gestion de la mémoire, mais je travaille actuellement sur un projet Qt (C++), en développant une application pour les appareils Symbian, en utilisant le Qt Nokia SDK.Comment gérer les fuites de mémoire?

Plate-forme: Windows 7

1'st question: Si je crée un bouton-poussoir comme celui-ci:

QPushButton * Bouton = new QPushButton (parent);

Dois-je le supprimer? (Je pense que non, puisque cela fait partie de l'interface utilisateur, mais corrigez-moi si je me trompe).

2 et la question: Comment puis-je trouver une fuite de mémoire, connaissez-vous de bons programmes qui peuvent m'aider avec cela?

J'ai essayé d'utiliser l'outil Nokia Analyzer, mais quand je lance atool:

atool.exe -lF construire udeb armv5 -f phoneMeomoryLog

je reçois juste

Type de construction: udeb Construire la plate-forme: armv5 mode de collecte des données: le journal pour fichier taille de la pile d'appel d'allocation: 40 taille de la pile d'appel gratuit: 0 différé gratuit: dis métrages abled Vérificateur de corruption de tas (blocs de garde): fonctionnalité désactivé AnalyzeTool: Erreur, création/lecture de fichiers makefiles.

quelqu'un Hope peut me répondre.

Merci à l'avance

Répondre

1
  1. La réponse à votre première Q est Non, il semble que, contrairement à Windows GUI standard des objets, dans Qt vous ne devriez pas le supprimer. Il est publié lorsque votre fenêtre principale est fermée.

  2. Vous pouvez utiliser le détecteur de lien de mémoire de Microsoft intégré à VS. Trouver plus dans this link.

+0

Avez-vous essayé cela sur un programme Qt? – Ikky

-1

Eh bien, je n'ai aucune expérience dans Qt Nokia SDK, mais basé sur mes connaissances C++.

  1. Oui. Tout ce qui a été créé par new devrait être libéré plus tard. Un pointeur ne peut pas se libérer et C++ n'offre aucun garbage collector.

  2. Il existe plusieurs façons. Par exemple, vérifier combien nouvelles « vous de faire et combien de supprimer » s. Pour chaque nouvelle il devrait y avoir un supprimer quelque part. Vérifiez la mémoire utilisée: si la mémoire utilisée ne cesse de croître et ne diminue jamais (ou pas souvent), vous ne gérez pas correctement la mémoire. Assurez-vous de supprimer les ressources allouées sur les destructeurs.

Pour éviter cela, vous pouvez utiliser auto-pointers

2

1'st question: Non, vous ne devez pas le supprimer. Il sera supprimé lorsque le parent sera supprimé. Vous devez donc supprimer le parent qui est probablement un formulaire ou une boîte de dialogue.

Lorsque vous créez la boîte de dialogue avec Qt Qt::WA_DeleteOnClose drapeau supprime ce widget lorsque le widget a accepté l'événement close. Vous n'aurez donc pas de fuites de mémoire.

Alors créez votre dialogue avec ce drapeau et ajoutez vos widgets que vous faites maintenant et vous serez bien.

2'nd question: Si vous utilisez sur l'utilisation de linux valgrind.

exemple: valgrind --tool = memcheck --leak-check = yes ./myprogramname

valgrind a beaucoup d'options que vous pouvez utiliser pour un réglage fin.

En utilisant * unique_ptr * ou * auto_ptr * si vous utilisez C++ ou QScopedPointer sont de bonnes techniques de programmation pour éviter les fuites de mémoire.

+0

Vous cherchez à Valgrind. Installation de Qt SDK à Linux en ce moment, donc je peux le vérifier. Merci pour toutes les réponses, ça aide vraiment. – Ikky

+0

Si un pointeur est alloué de la mémoire par new, il DEVRAIT être supprimé plus tard. Le parent libère juste les ressources de l'interface utilisateur, pas la mémoire !!! – hsalimi

+3

Lire http://doc.qt.nokia.com/4.6/objecttrees.html (arbres d'objets et d'objets de propriété) de l'intervalle QT. Il indique explicitement que "lorsque vous créez un QObject avec un autre objet en tant que parent, il est ajouté à la liste des enfants() du parent, et est supprimé lorsque le parent est". –

0

deux « Il est libéré lorsque la fenêtre principale est fermée. » et "Le parent libère juste les ressources de l'interface utilisateur, pas la mémoire !!! - hsalimi" ont tort. Le parent conserve une liste de ses enfants et les supprime lorsqu'il est lui-même détruit. Cela n'a rien à voir avec les "ressources de l'interface utilisateur" ou la "fenêtre principale", c'est un comportement QObject normal. std :: auto_ptr n'est ni nécessaire ni utile ici non plus.