あなたが提供した簡単なプログラム (ValgrindTest という名前) は、C で書かれた単純な hello-world プログラムです。
#include <iostream> int main() { return 0; }
このプログラムが Valgrind (バージョン 3.10.1) を使用して実行されると、まだ到達可能な 1 ブロック内の 72,704 バイト:
$ 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)
まだ到達可能な警告について心配するかどうかは気にしませんが、標準ライブラリのオブジェクトがプログラムに割り当てられていない場合に、標準ライブラリのヘッダーを含めるだけで、まだ到達可能な警告がどのように発生する可能性があるかについて質問しました。
答えは、C 標準ライブラリが独自のメモリ管理システムを使用しており、オペレーティング システムからメモリを割り当て、そのメモリ自体を管理するというものです。 標準ライブラリ ヘッダーを組み込むと、基本的に、このメモリ管理システムを含む標準ライブラリ コードに対してプログラムをリンクすることになります。 その結果、標準ライブラリ コードによって割り当てられたメモリは、標準ライブラリからオブジェクトを自分で明示的に割り当てなくても、プログラムから引き続き到達可能です。
まだ到達可能であるという警告を修正するには 2 つの方法があります。
まだ到達可能な警告は無視してください。メモリ リークについては心配しないため、まだ到達可能であるという警告は無視してかまいません。 これを行うには、Valgrind の実行時に --leak-check=no フラグを設定します。
valgrind --leak-check=no ./ValgrindTest
まだ到達可能であることを覚えておくことが重要です。警告は必ずしもメモリ リークを示しているわけではありません。 この場合、まだ到達可能であるという警告は標準ライブラリのメモリ管理システムが原因で発生するため、メモリ リークを心配しない場合は無視しても問題ありません。
以上が単純な C の hello-world プログラムを Valgrind で実行すると、メモリが割り当てられていないにもかかわらず、「まだ到達可能です」というメモリ警告が表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。