Program remeh (bernama ValgrindTest) yang anda sediakan ialah program hello-world ringkas yang ditulis dalam C .
#include <iostream> int main() { return 0; }
Apabila program ini dijalankan menggunakan Valgrind (versi 3.10.1), ia melaporkan bahawa terdapat 72,704 bait dalam 1 blok yang masih boleh dicapai:
$ 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)
Anda tidak bimbang sama ada atau tidak bimbang tentang amaran yang masih boleh dicapai, tetapi anda ada bertanya tentang bagaimana hanya memasukkan pengepala perpustakaan standard boleh menyebabkan amaran yang masih boleh dicapai, apabila tiada objek daripada perpustakaan itu diperuntukkan dalam program sendiri.
Jawapannya ialah perpustakaan standard C menggunakan sistem pengurusan memorinya sendiri, yang memperuntukkan memori daripada sistem pengendalian dan kemudian menguruskan memori itu sendiri. Apabila anda memasukkan pengepala perpustakaan standard, anda pada dasarnya memautkan program anda dengan kod perpustakaan standard, yang termasuk sistem pengurusan memori ini. Akibatnya, memori yang diperuntukkan oleh kod perpustakaan standard masih boleh dicapai daripada program anda, walaupun anda tidak memperuntukkan sendiri sebarang objek daripada pustaka standard secara eksplisit.
Terdapat dua cara untuk membetulkan amaran yang masih boleh dicapai:
Abaikan amaran yang masih boleh dicapai. Jika anda tidak mengambil berat tentang kebocoran memori, anda boleh mengabaikan amaran yang masih boleh dicapai. Untuk melakukan ini, anda boleh menetapkan bendera --leak-check=no apabila anda menjalankan Valgrind:
valgrind --leak-check=no ./ValgrindTest
Adalah penting untuk diingat bahawa masih boleh dicapai amaran tidak semestinya menunjukkan kebocoran ingatan. Dalam kes ini, amaran yang masih boleh dicapai disebabkan oleh sistem pengurusan memori perpustakaan standard dan ia boleh diabaikan dengan selamat jika anda tidak bimbang tentang kebocoran memori.
Atas ialah kandungan terperinci Mengapakah program hello-world C yang mudah, apabila dijalankan dengan Valgrind, menunjukkan amaran memori \'masih boleh dicapai\' walaupun tidak memperuntukkan sebarang memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!