Maison > développement back-end > C++ > Pourquoi un simple programme C hello-world, lorsqu'il est exécuté avec Valgrind, affiche-t-il un avertissement de mémoire « toujours accessible » même s'il n'alloue aucune mémoire ?

Pourquoi un simple programme C hello-world, lorsqu'il est exécuté avec Valgrind, affiche-t-il un avertissement de mémoire « toujours accessible » même s'il n'alloue aucune mémoire ?

Mary-Kate Olsen
Libérer: 2024-11-29 02:30:13
original
927 Les gens l'ont consulté

Why does a simple C   hello-world program, when run with Valgrind, show a

Le programme trivial et le résultat

Le programme trivial (nommé ValgrindTest) que vous avez fourni est un simple programme hello-world écrit en C.

#include <iostream>
int main() {
  return 0;
}
Copier après la connexion

Lorsque ce programme est exécuté avec Valgrind (version 3.10.1), il signale qu'il y a 72 704 octets dans 1 bloc qui sont toujours accessibles :

$ valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./ValgrindTest
==27671== Memcheck, a memory error detector
==27671== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==27671== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==27671== Command: ./ValgrindTest
==27671== 
==27671== 
==27671== HEAP SUMMARY:
==27671==     in use at exit: 72,704 bytes in 1 blocks
==27671==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==27671== 
==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)
==27671==    by 0x400F305: call_init.part.0 (dl-init.c:85)
==27671==    by 0x400F3DE: call_init (dl-init.c:52)
==27671==    by 0x400F3DE: _dl_init (dl-init.c:134)
==27671==    by 0x40016E9: ??? (in /lib/x86_64-linux-gnu/ld-2.15.so)
==27671== 
==27671== LEAK SUMMARY:
==27671==    definitely lost: 0 bytes in 0 blocks
==27671==    indirectly lost: 0 bytes in 0 blocks
==27671==      possibly lost: 0 bytes in 0 blocks
==27671==    still reachable: 72,704 bytes in 1 blocks
==27671==         suppressed: 0 bytes in 0 blocks
==27671== 
==27671== For counts of detected and suppressed errors, rerun with: -v
==27671== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Copier après la connexion

La cause de l'avertissement toujours accessible

Vous ne vous souciez pas de savoir si vous devez ou non vous inquiéter des avertissements toujours accessibles, mais vous avez demandé sur la façon dont le simple fait d'inclure un en-tête de bibliothèque standard pourrait provoquer un avertissement toujours accessible, lorsqu'aucun objet de cette bibliothèque n'a été alloué dans le programme lui-même.

La réponse est que la bibliothèque standard C utilise son propre système de gestion de la mémoire, qui alloue la mémoire du système d'exploitation et gère ensuite cette mémoire lui-même. Lorsque vous incluez un en-tête de bibliothèque standard, vous liez essentiellement votre programme au code de bibliothèque standard, qui inclut ce système de gestion de mémoire. Par conséquent, la mémoire allouée par le code de la bibliothèque standard est toujours accessible depuis votre programme, même si vous n'allouez explicitement aucun objet de la bibliothèque standard vous-même.

Comment corriger l'avertissement toujours accessible

Il existe deux façons de corriger l'avertissement toujours accessible :

  1. Configurez votre compilateur pour utiliser une gestion de mémoire différente system. Cela peut être fait en définissant l'indicateur -D_GLIBCXX_FORCE_NEW=1 lorsque vous compilez votre programme. Cet indicateur indique au compilateur d'utiliser les fonctions malloc() et free() au lieu du système de gestion de mémoire de la bibliothèque standard.
  2. Ignorez l'avertissement toujours accessible. Si vous êtes Si vous ne vous souciez pas des fuites de mémoire, vous pouvez simplement ignorer l'avertissement toujours accessible. Pour ce faire, vous pouvez définir l'indicateur --leak-check=no lorsque vous exécutez Valgrind :

    valgrind --leak-check=no ./ValgrindTest
    Copier après la connexion

Conclusion

Il est important de se rappeler que toujours accessible les avertissements ne sont pas nécessairement révélateurs d’une fuite de mémoire. Dans ce cas, l'avertissement toujours accessible est provoqué par le système de gestion de la mémoire de la bibliothèque standard et peut être ignoré en toute sécurité si vous n'êtes pas préoccupé par les fuites de mémoire.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal