Maison >développement back-end >C++ >Pourquoi l'inclusion de `` dans C provoque-t-elle les avertissements « Toujours accessible » de Valgrind ?
Cet article se penche sur la question de savoir pourquoi simplement inclure le Le fourni l'extrait de code est un simple programme "hello world" qui inclut le L'exécution de ce programme via Valgrind avec la vérification des fuites et le suivi des origines activés révèle le résultat suivant : Cela indique que 72 704 octets sont toujours accessible même si aucune mémoire n'est explicitement allouée dans le programme. Bien que l'avertissement de Valgrind puisse être préoccupant, il est important de comprendre qu'il s'agit d'un comportement courant pour les programmes C. De nombreuses implémentations de la bibliothèque standard C utilisent leurs propres allocateurs de pool de mémoire, qui regroupent la mémoire pour les objets détruits et les réutilisent ultérieurement. Cette technique de gestion optimisée de la mémoire réduit la surcharge de mémoire et améliore les performances. Cependant, étant donné que Valgrind fonctionne en supposant que toute la mémoire allouée doit être restituée au système d'exploitation à la fin du programme, il signale la mémoire détenue par ces pools comme toujours joignable. Il ne s'agit pas nécessairement d'un bug du programme ou de Valgrind, mais plutôt d'une différence d'attente. Si vous souhaitez éliminer les avertissements encore accessibles avec Valgrind, vous pouvez désactivez les pools de mémoire STL (Standard Template Library) en modifiant les paramètres du compilateur. Voici quelques méthodes : Avec les versions 2.91 à 3.1 de GCC, vous pouvez compiler le programme en utilisant -D__USE_MALLOC pour forcer la STL à utiliser malloc et à libérer de la mémoire rapidement. Cependant, cette option a été supprimée dans GCC 3.3 et versions ultérieures. Pour les versions 3.2.2 et ultérieures de GCC, vous pouvez définir la variable d'environnement GLIBCPP_FORCE_NEW avant d'exécuter le programme. Pour GCC 3.4 et versions ultérieures, le nom de la variable d'environnement est GLIBCXX_FORCE_NEW. Avec les compilateurs plus récents, vous pouvez utiliser l'indicateur -fno-optimize-sibling-calls pour désactiver l'appel frère. optimisation, qui inclut le pool de mémoire STL optimisation. Incluant le Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!Le programme et la sortie Valgrind :
#include <iostream>
int main() {
return 0;
}
==27671== Memcheck, a memory error detector
... (output truncated)
...
==27671== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==27671== at 0x4C2AB9D: malloc (vg_replace_malloc.c:296)
==27671== by 0x4EC060F: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
... (output truncated)
Valgrind's Comportement :
Désactivation de l'optimisation de la bibliothèque C :
Utilisation de __USE_MALLOC :
Utilisation des variables d'environnement :
Utilisation des indicateurs du compilateur :
Conclusion :