Artikel ini membincangkan isu mengapa hanya memasukkan Yang disediakan coretan kod ialah program "hello world" ringkas yang merangkumi Menjalankan program ini melalui Valgrind dengan semakan kebocoran dan penjejakan asal didayakan mendedahkan output berikut: Ini menunjukkan bahawa 72,704 bait masih ada boleh dicapai walaupun tidak memperuntukkan sebarang memori secara eksplisit dalam program. Walaupun amaran Valgrind mungkin membimbangkan, adalah penting untuk memahami bahawa ini adalah gelagat biasa untuk program C. Banyak pelaksanaan perpustakaan standard C menggunakan pengalokasi kolam memori mereka sendiri, yang mengumpulkan memori untuk objek yang musnah dan menggunakannya semula kemudian. Teknik pengurusan memori yang dioptimumkan ini mengurangkan overhed memori dan meningkatkan prestasi. Walau bagaimanapun, memandangkan Valgrind beroperasi di bawah andaian bahawa semua memori yang diperuntukkan harus dikembalikan kepada sistem pengendalian apabila program ditamatkan, ia melaporkan memori yang dipegang oleh kumpulan ini sebagai masih boleh dihubungi. Ini tidak semestinya pepijat dalam program atau Valgrind, sebaliknya perbezaan jangkaan. Jika anda ingin menghapuskan amaran yang masih boleh dicapai dengan Valgrind, anda boleh lumpuhkan kumpulan memori STL (Perpustakaan Templat Standard) dengan mengubah suai tetapan pengkompil. Berikut ialah beberapa kaedah: Dengan GCC versi 2.91 hingga 3.1, anda boleh menyusun atur cara menggunakan -D__USE_MALLOC untuk memaksa STL menggunakan malloc dan memori bebas dengan segera. Walau bagaimanapun, pilihan ini telah dialih keluar dalam GCC 3.3 dan lebih baru. Untuk GCC versi 3.2.2 dan lebih baharu, anda boleh menetapkan pembolehubah persekitaran GLIBCPP_FORCE_NEW sebelum menjalankan program. Untuk GCC 3.4 dan ke atas, nama pembolehubah persekitaran ialah GLIBCXX_FORCE_NEW. Dengan pengkompil yang lebih baharu, anda boleh menggunakan bendera -fno-optimize-sibling-calls untuk melumpuhkan panggilan adik-beradik pengoptimuman, yang termasuk kumpulan memori STL pengoptimuman. Termasuk Atas ialah kandungan terperinci Mengapa Memasukkan `` dalam C Menyebabkan Amaran \'Masih Boleh Dicapai\' Valgrind?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!Program dan Output Valgrind:
#include <iostream>
int main() {
return 0;
}
==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)
Gelagat Valgrind:
Melumpuhkan Pengoptimuman Perpustakaan C:
Menggunakan __USE_MALLOC:
Menggunakan Pembolehubah Persekitaran:
Menggunakan Bendera Pengkompil:
Kesimpulan: