Maison >développement back-end >C++ >Pourquoi l'inclusion de `` dans C provoque-t-elle les avertissements « Toujours accessible » de Valgrind ?

Pourquoi l'inclusion de `` dans C provoque-t-elle les avertissements « Toujours accessible » de Valgrind ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-03 18:35:13684parcourir

Why Does Including `` in C   Cause Valgrind's

Inclure un en-tête de bibliothèque standard en C et les avertissements Valgrind

Introduction :

Cet article se penche sur la question de savoir pourquoi simplement inclure le

Le programme et la sortie Valgrind :

Le fourni l'extrait de code est un simple programme "hello world" qui inclut le en-tête mais n'effectue aucune allocation :

#include <iostream>

int main() {
  return 0;
}

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 :

==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)

Cela indique que 72 704 octets sont toujours accessible même si aucune mémoire n'est explicitement allouée dans le programme.

Valgrind's Comportement :

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.

Désactivation de l'optimisation de la bibliothèque C :

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 :

Utilisation de __USE_MALLOC :

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.

Utilisation des variables d'environnement :

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.

Utilisation des indicateurs du compilateur :

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.

Conclusion :

Incluant le l'en-tête seul ne provoque pas de fuites de mémoire, mais il peut déclencher des avertissements toujours accessibles dans Valgrind en raison de la gestion du pool de mémoire de la bibliothèque C. Ce comportement est attendu et ne constitue pas un bug. La désactivation des optimisations STL peut éliminer ces avertissements, mais cela peut se faire au prix d'une diminution des performances.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn