Loading [MathJax]/extensions/tex2jax.js

Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++ Valgrind

ValgrindのStill Reachableの意味や実際のサンプルをご紹介

投稿日:2021年10月28日 更新日:

 

<目次>

(1) ValgrindのStill Reachableの意味や実際のサンプルをご紹介
 (1-1) Valgrindの「Still Reachable」はどんな状況?
 (1-2) 例1:サンプルプログラム(still reachable発生版)
 (1-3) 例1:Valgrindのメモリリーク確認結果
 (1-4) 例2:サンプルプログラム(still reachable解消版)

(1) ValgrindのStill Reachableの意味や実際のサンプルをご紹介

本記事ではValgrindにおけるメモリリークのカテゴリの1つである「Still Reachable」についてご紹介します。

(1-1) Valgrindの「Still Reachable」はどんな状況?

メモリの解放漏れではあるものの、まだそのメモリへのポインタが残っており、アクセスが可能な状況。一般的にこのステータスは害が無いとされており、真のメモリリーク(メモリを解放したくとも、そのメモリを指すポインタが失われており、解放ができない状況)と比べても害が無いため、メモリリークとしては扱われないケースも多いです。
 
(例)グローバル変数など、共用部分で確保したメモリの解放が漏れているが、まだアクセス可能な状態
 
例えば次のようなポインタ「*x1」があり、それに対して要素3つのchar型の配列を動的に割当てします。その配列のメモリを解放(delete []x1;)しないままプログラムを終了したようなケースで「still reachable」の判定になります。
 
(図111)

(1-2) 例1:サンプルプログラム(still reachable発生版)

前述の(図111)の状況を実際に再現したのが次の(例1)のサンプルプログラムです。
 
(例1)
  1. #include <stdlib.h>
  2. char *x1 = new char[3];
  3.  
  4. int main(void)
  5. {
  6. return 0;
  7. }
(図121)

(1-3) 例1:Valgrindのメモリリーク確認結果

上記のサンプルプログラムをコンパイルし、valgrindコマンドでメモリリークチェック(⇒★)を実行した際の出力結果をご紹介します。
 
(出力サンプル)
  1. ==12936== HEAP SUMMARY:
  2. ==12936== in use at exit: 100 bytes in 1 blocks
  3. ==12936== total heap usage: 1 allocs, 0 frees, 100 bytes allocated
  4. ==12936==
  5. ==12936== 100 bytes in 1 blocks are still reachable in loss record 1 of 1
  6. ==12936== at 0x4C2C866: operator new[](unsigned long) (vg_replace_malloc.c:579)
  7. ==12936== by 0x4005BE: __static_initialization_and_destruction_0(int, int) (memorytest2.cpp:4)
  8. ==12936== by 0x4005DA: _GLOBAL__sub_I_x1 (memorytest2.cpp:9)
  9. ==12936== by 0x40062C: __libc_csu_init (in /tmp_rainbow/memorytest2)
  10. ==12936== by 0x567D364: (below main) (libc-start.c:225)
  11. ==12936==
  12. ==12936== LEAK SUMMARY:
  13. ==12936== definitely lost: 0 bytes in 0 blocks
  14. ==12936== indirectly lost: 0 bytes in 0 blocks
  15. ==12936== possibly lost: 0 bytes in 0 blocks
  16. ==12936== still reachable: 100 bytes in 1 blocks
  17. ==12936== suppressed: 0 bytes in 0 blocks
(図131)

(参考)
「Still Reachable」のカテゴリを結果に表示したい場合には、valgrindコマンドでメモリをチェックする際に「–show-reachable」の指定が必要です。
 
(例)
  1. valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ../チェック対象プログラム

(1-4) 例2:サンプルプログラム(still reachable解消版)

先程のプログラムに対して、メモリの解放を追記して「still reachable」の状況をも改善したバージョンもご紹介します(delete []x1;を追記したのみです)。
 
(例2)
  1. #include <stdlib.h>
  2.  
  3. char *x1 = new char[3];
  4.  
  5. int main(void)
  6. {
  7. delete []x1;
  8. return 0;
  9. }
(図141)

メモリ解放を追記すると「still reachable」が表示されなくなりました。
 
(出力サンプル)
  1. ==11328== HEAP SUMMARY:
  2. ==11328== in use at exit: 0 bytes in 0 blocks
  3. ==11328== total heap usage: 1 allocs, 1 frees, 3 bytes allocated
  4. ==11328==
  5. ==11328== All heap blocks were freed -- no leaks are possible
  6. ==11328==
  7. ==11328== For lists of detected and suppressed errors, rerun with: -s
  8. ==11328== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
(図142)

Adsense審査用広告コード


Adsense審査用広告コード


-C++, Valgrind

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

<目次> (1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介  (1-1) 概要  (1-2) サンプルプログラム①:疎通確認 (1) C++のunsign …

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

C++の「->」(アロー演算子)とは?意味や使い方をご紹介

  <目次> (1) C++の「->」(アロー演算子)とは?意味や使い方をご紹介  (1-1) C++の「->」(アロー演算子=arrow operator)とは?  (1-2) …

CORBA通信のPOA(Portable Object Adapter)とは?

  <目次> (1) CORBA通信のPOA(Portable Object Adapter)とは?  (1-1) 概要と特徴  (1-2) 一般的なPOAの処理構成  (1-3) POAの …

Valgrindで行番号を表示させる方法

  <目次> (1) Valgrindで行番号を表示させる方法  (1-1) 行番号を表示させる方法  (1-2) (参考)「-g」オプションについて (1) Valgrindで行番号を表示 …

  • English (United States)
  • 日本語
S