ホームページ >バックエンド開発 >C++ >単純な C の hello-world プログラムを Valgrind で実行すると、メモリが割り当てられていないにもかかわらず、「まだ到達可能です」というメモリ警告が表示されるのはなぜですか?

単純な C の hello-world プログラムを Valgrind で実行すると、メモリが割り当てられていないにもかかわらず、「まだ到達可能です」というメモリ警告が表示されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-29 02:30:13922ブラウズ

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

簡単なプログラムと出力

あなたが提供した簡単なプログラム (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 つの方法があります。

  1. 次のようにコンパイラを設定します。別のメモリ管理システムを使用します。 これは、プログラムのコンパイル時に -D_GLIBCXX_FORCE_NEW=1 フラグを設定することで実行できます。 このフラグは、標準ライブラリのメモリ管理システムの代わりに malloc() 関数と free() 関数を使用するようにコンパイラに指示します。
  2. まだ到達可能な警告は無視してください。メモリ リークについては心配しないため、まだ到達可能であるという警告は無視してかまいません。 これを行うには、Valgrind の実行時に --leak-check=no フラグを設定します。

    valgrind --leak-check=no ./ValgrindTest

結論

まだ到達可能であることを覚えておくことが重要です。警告は必ずしもメモリ リークを示しているわけではありません。 この場合、まだ到達可能であるという警告は標準ライブラリのメモリ管理システムが原因で発生するため、メモリ リークを心配しない場合は無視しても問題ありません。

以上が単純な C の hello-world プログラムを Valgrind で実行すると、メモリが割り当てられていないにもかかわらず、「まだ到達可能です」というメモリ警告が表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。