Rumah > pembangunan bahagian belakang > C++ > Mengapa Memasukkan `` dalam C Menyebabkan Amaran \'Masih Boleh Dicapai\' Valgrind?

Mengapa Memasukkan `` dalam C Menyebabkan Amaran \'Masih Boleh Dicapai\' Valgrind?

Linda Hamilton
Lepaskan: 2024-12-03 18:35:13
asal
685 orang telah melayarinya

Why Does Including `` in C   Cause Valgrind's

Termasuk Pengepala Perpustakaan Standard dalam C dan Amaran Valgrind

Pengenalan:

Artikel ini membincangkan isu mengapa hanya memasukkan

Program dan Output Valgrind:

Yang disediakan coretan kod ialah program "hello world" ringkas yang merangkumi pengepala tetapi tidak melaksanakan sebarang peruntukan:

#include <iostream>

int main() {
  return 0;
}
Salin selepas log masuk

Menjalankan program ini melalui Valgrind dengan semakan kebocoran dan penjejakan asal didayakan mendedahkan output berikut:

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

Ini menunjukkan bahawa 72,704 bait masih ada boleh dicapai walaupun tidak memperuntukkan sebarang memori secara eksplisit dalam program.

Gelagat Valgrind:

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.

Melumpuhkan Pengoptimuman Perpustakaan C:

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:

Menggunakan __USE_MALLOC:

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.

Menggunakan Pembolehubah Persekitaran:

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.

Menggunakan Bendera Pengkompil:

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.

Kesimpulan:

Termasuk pengepala sahaja tidak menyebabkan kebocoran memori, tetapi ia boleh mencetuskan amaran yang masih boleh dicapai dalam Valgrind disebabkan oleh pengurusan kolam memori perpustakaan C. Tingkah laku ini dijangka dan bukan pepijat. Melumpuhkan pengoptimuman STL boleh menghapuskan amaran ini, tetapi ia mungkin melibatkan kos penurunan prestasi.

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!

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