Rubriques

>> Toutes les rubriques <<
· Informatique (67)
· Nature : Aquarium, plantes, et animaux (12)
· Politique et Information (23)
· Sciences (8)
· Musique (7)
· Films (10)
· Peinture, photo (2)
· Histoire (8)
· Bouquins (7)
· Femmes hors du commun (1)

Rechercher
Derniers commentaires

welcome http://mobstan o01.centerblog .net
Par mobstano01, le 11.01.2020

medium retour d'etre aimer chance au jeux loto richesse de la porte monnaie magique valise magique ce qui
Par Anonyme, le 07.11.2019

merci... http://bernie- liege.centerbl og.net
Par bernie-liege, le 27.09.2019

beau travail !
Par Anonyme, le 23.09.2019

dd
Par Anonyme, le 13.06.2019

Voir plus

Articles les plus lus

· Histoire de pet et de dromadaire
· Le concombre tueur !
· L'origine du Monde
· Aux Philippines, trois cent nouvelles espèces !
· Vol de corne de rhinocéros à l'aquarium de Liège

· le Quintette à cordes D 956 de Schubert
· Le dormeur du Val
· Encore des choses surprenantes dans la Nature
· Inception, ou la puissance de l'inconscient
· Ajout du projet Littré dans un media-Wiki
· Bac de quarante mille litres
· Dutronc, je retourne ma veste
· Mort du chanteur Alain Leprest
· Aquarium de Bruxelles
· Le blues de l'informaticien

Voir plus 

Abonnement au blog
Recevez les actualités de mon blog gratuitement :

Je comprends qu’en m’abonnant, je choisis explicitement de recevoir la newsletter du blog "bernie-liege" et que je peux facilement et à tout moment me désinscrire.


Statistiques

Date de création : 20.05.2011
Dernière mise à jour : 29.09.2019
164 articles


Thèmes

communiste deferencement pointeur C

Fuite de mémoire en C++

Publié le 06/04/2018 à 11:27 par bernie-liege Tags : deferencement pointeur C

https://denis-navarro.developpez.com/tutoriels/cpp/comment-eviter-facilement-dereferencements-pointeur-nul-et-fuites-memoire/

 

Intro: 

En C++, la mauvaise utilisation des pointeurs peut conduire à des bogues, dont les suivants :

  • déréférencer un pointeur nul ;
  • oublier de désallouer une donnée allouée (fuite de mémoire) ;
  • déréférencer un pointeur vers une zone mémoire qui n'est plus utilisée.

Parmi ces trois bogues, l'article présent se focalise sur les deux premiers.

Pour éviter ces deux bogues, il existe plusieurs solutions.

Voici des solutions chronophages et peu efficaces :

  • alourdir la documentation pour préciser quels pointeurs peuvent être nuls et sur lesquels il faudra appeler delete ou delete[] quand on n'aura plus besoin de la donnée pointée. La documentation est alors plus longue à lire et à écrire. En outre, elle risque de ne pas être lue ;
  • alourdir le code avec des contrôles de non-nullité des pointeurs, par exemple assert(ptr != nullptr); ou if(ptr == nullptr) throw std::logic_error("ptr is null.");. Le code est alors plus long à lire et à écrire. En plus, quand les contrôles sont actifs, cela diminue les performances ;
  • augmenter le nombre de tests pour détecter plus de bogues à l'exécution. Lors des tests, utiliser des outils pour détecter à l'exécution les déréférencements de pointeur nul et les fuites de mémoire. Quand on doit lutter contre du code historique, c'est bien, mais le mieux aurait été d'éviter les bogues en amont ;
  • coder plus lentement en vérifiant, pour chaque pointeur, s'il peut être nul et s'il faudra appeler delete ou delete[] quelque part. Quand on doit lutter contre du code historique, c'est bien, mais le mieux aurait été d'avoir accès instantanément à ces informations, sans avoir besoin de vérifier.

L'article présent n'abordera pas davantage les solutions ci-dessus.

Voici d'autres solutions, plus efficaces, qui seront abordées dans cet article :

  • à la place d'un pointeur, utiliser un autre type en fonction du besoin, par exemple une référence ou un std::unique_ptr ;
  • allonger le nom des fonctions et des variables. Par exemple, soit une fonction Car const* Person::getCar() const noexcept. Si elle peut retourner un pointeur nul, alors on peut la renommer en getCarOrNull ;
  • fixer des conventions. Par exemple : « Sauf mention explicite du contraire, tout pointeur vers un type caractère (ex. : char const*) est non nul et représente une chaîne de caractères terminée par '\0'. »