Comment trouver une fuite de mémoire dans un code / projet C ++

Comment trouver une fuite de mémoire dans un code / projet C ++
UN fuite de mémoire Dans un code ou un projet C ++ se produit lorsqu'un programme revendique plus de mémoire qu'il n'en a besoin et ne relâche pas la mémoire supplémentaire au système d'exploitation. Fuites de mémoire peut présenter en termes d'une application à court de mémoire de façon inattendue et à planter ou à avoir une grande différence de performance entre deux courses successives. Ce problème peut entraîner une défaillance critique du système dans un code ou un projet C ++ et doit être débogué dès que possible.

Cet article discutera de ce qu'un fuite de mémoire est puis fourni une description détaillée de la façon de trouver fuites de mémoire Dans un code ou un projet C ++.

Qu'est-ce qu'une fuite de mémoire

Un problème d'ordinateur appelé un fuite de mémoire provoque l'attribution de la mémoire et de mal libérer. Lorsque la mémoire au sein d'un programme n'est plus utilisée par le programme, la mémoire doit être libérée dans le système d'exploitation, permettant une utilisation efficace de toute la mémoire disponible sur un système. Cependant, lorsqu'un programme ne publie pas la mémoire allouée et continue d'y accéder une fois que son utilité a été servie, fuites de mémoire peut arriver. Cela peut conduire à la mémoire consommée ou 'divulgué'Jusqu'à ce que le système manque de mémoire libre et que le programme s'écrase. Étant donné que tous les systèmes ont une quantité finie de mémoire et parce que la mémoire est coûteuse, l'utilisation de la mémoire d'un programme augmentera si elle contient fuites de mémoire. Ainsi, cela causera des problèmes.

Comment trouver des fuites de mémoire dans un code ou un projet C ++?

Il existe des moyens de base pour détecter les fuites de mémoire dans un code C ++.

1: Vérifiez les bases des opérateurs

Connaître les principes fondamentaux des opérateurs. Un nouvel opérateur alloue une mémoire de tas. La mémoire du tas est libérée à l'aide de l'opérateur de suppression. Pour libérer le même souvenir qui a été alloué, vous devez faire une suppression après chaque nouveau, sinon, il y a une chance de fuite de mémoire.

2: réaffecter uniquement après la suppression

Réaffecter une mémoire uniquement après avoir supprimé sa première allocation. Si une variable obtient une nouvelle adresse pour une seconde allocation, la première adresse et les octets qui y sont associés sont perdus en permanence fuite de mémoire.

3: Vérifiez les pointeurs attribués

Observer les pointeurs attribués. Chaque variable dynamique (mémoire allouée sur le tas) doit être connectée à un pointeur. Il est difficile de supprimer une variable dynamique après sa séparation de son (s) pointeur (s). Une fois de plus, cela provoque un fuite de mémoire.

4: Vérifiez les pointeurs locaux

Utilisez soigneusement les pointeurs locaux. Lorsque vous définissez un pointeur dans une fonction, la variable dynamique à laquelle il pointe est allouée sur le tas, pas la pile. Il restera si vous ne le supprimez pas même une fois le programme terminé fuites de mémoire.

5: Utilisez des crochets après la suppression soigneusement

Prenez note des crochets qui suivent «supprimer". Pour libérer un seul élément, utilisez la suppression en soi. Pour libérer un tableau de tas, utilisez la suppression de [] entre crochets.

Comment éviter les fuites de mémoire?

  • Dans la mesure du possible, essayez d'utiliser des pointeurs intelligents plutôt que de gérer manuellement la mémoire.
  • Substituer std :: chaîne par char *. La classe Std :: String, qui est rapide et bien optimisée, gère toute la gestion de la mémoire à l'intérieur.
  • N'utilisez jamais un pointeur brut sauf si vous avez besoin de vous connecter à une bibliothèque obsolète.
  • Aucun ou un petit nombre d'appels nouveaux / supprimés dans le programme est la méthode la plus simple pour prévenir fuites de mémoire en c++. Toute exigence de mémoire dynamique doit être cachée à l'intérieur d'un objet RAII qui libère la mémoire à la sortie. RAII garantit que la mémoire sera traitée lorsqu'une variable quitte sa portée actuelle en allouant la mémoire dans le constructeur et en la libérant dans le destructeur.
  • Écrivez tout le code entre les mots clés nouveaux et supprimés qui sont utilisés pour allouer et traiter la mémoire.

Programme pour éviter les fuites de mémoire

Par exemple:

#inclure
#inclure
Utilisation de Namespace Std;
void func_to_handle_mem_leak ()

int * ptr = new int (5);
couter<
int main()

func_to_handle_mem_leak ();
retour 0;

Le aiguille dans le programme ci-dessus n'est pas supprimé après son allocation. Cela provoque le fuite de mémoire Dans le code C ++ ci-dessus.

#inclure
#inclure
Utilisation de Namespace Std;
void func_to_handle_mem_leak ()

int * ptr = new int (5);
couter<supprimer (ptr);

int main()

func_to_handle_mem_leak ();
retour 0;

Dans ce code, nous supprimons donc le pointeur dans la fonction définie par l'utilisateur fuite de mémoire est évité.

Sortir

Conclusion

Fuites de mémoire dans un programme peut avoir des résultats néfastes, que le programme soit petit ou grand. Résoudre fuites de mémoire, Les outils d'analyse statique, les outils de diagnostic et les outils de débogage font partie intégrante de la recherche et de la résolution du problème. En tant que tel, le code ou les projets C ++ doivent être régulièrement examinés et analysés pour détecter tout fuites de mémoire, En utilisant les outils et techniques ci-dessus, vous pouvez atténuer les fuites de mémoire dans un code C ++.