Le programme trivial (nommé ValgrindTest) que vous avez fourni est un simple programme hello-world écrit en C.
#include <iostream> int main() { return 0; }
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)
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.
Il existe deux façons de corriger l'avertissement toujours accessible :
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
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!