Rumah > pembangunan bahagian belakang > C++ > Mengapakah program hello-world C yang mudah, apabila dijalankan dengan Valgrind, menunjukkan amaran memori \'masih boleh dicapai\' walaupun tidak memperuntukkan sebarang memori?

Mengapakah program hello-world C yang mudah, apabila dijalankan dengan Valgrind, menunjukkan amaran memori \'masih boleh dicapai\' walaupun tidak memperuntukkan sebarang memori?

Mary-Kate Olsen
Lepaskan: 2024-11-29 02:30:13
asal
991 orang telah melayarinya

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

Program dan Output Trivial

Program remeh (bernama ValgrindTest) yang anda sediakan ialah program hello-world ringkas yang ditulis dalam C .

#include <iostream>
int main() {
  return 0;
}
Salin selepas log masuk

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)
Salin selepas log masuk

Punca Amaran Masih Boleh Dicapai

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.

Cara Membetulkan Amaran Masih Boleh Dicapai

Terdapat dua cara untuk membetulkan amaran yang masih boleh dicapai:

  1. Konfigurasikan pengkompil anda untuk menggunakan sistem pengurusan memori yang berbeza. Ini boleh dilakukan dengan menetapkan bendera -D_GLIBCXX_FORCE_NEW=1 apabila anda menyusun atur cara anda. Bendera ini memberitahu pengkompil untuk menggunakan fungsi malloc() dan free() dan bukannya sistem pengurusan memori perpustakaan standard.
  2. 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
    Salin selepas log masuk

Kesimpulan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan