Rainbow Engine

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

C++ Valgrind

ValgrindのDefinetely Lostの意味や実際のサンプルをご紹介

投稿日:2021年11月4日 更新日:

 

<目次>

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

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

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

(1-1) Valgrindの「Definetely Lost」はどんな状況?

明らかなるメモリリークで、最も緊急性が高いステータスです。ヒープ領域のメモリ(newによる動的割当て等)が解放されずに、なおかつメモリへのポインタが残っておらず、解放したくともアクセスが出来ない状況下で発生します。
 
(例)メソッドの中で確保したメモリがメソッドを抜けた後に使用不可になる
 
例えば、new char[3]でchar型の配列のメモリを動的に確保します。その先頭の要素(アドレス「0xdafeb8」)へのポインタを「*x1」に格納し、メモリを解放しないままmain文を抜けると、メモリへのポインタが失われてしまい「Definetely Lost」が発生します。
 
(図111)

目次にもどる

(1-2) 例1:サンプルプログラム

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

    return 0;
}
(図121)

目次にもどる

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

上記のサンプルプログラムをコンパイルし、valgrindコマンドでメモリリークチェック(⇒★)を実行した際の出力結果をご紹介します。
 
(出力サンプル)
==13514== HEAP SUMMARY:
==13514==     in use at exit: 100 bytes in 1 blocks
==13514==   total heap usage: 1 allocs, 0 frees, 100 bytes allocated
==13514==
==13514== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
==13514==    at 0x4C2C866: operator new[](unsigned long) (vg_replace_malloc.c:579)
==13514==    by 0x40059E: main (memorytest.cpp:5)
==13514==
==13514== LEAK SUMMARY:
==13514==    definitely lost: 100 bytes in 1 blocks
==13514==    indirectly lost: 0 bytes in 0 blocks
==13514==      possibly lost: 0 bytes in 0 blocks
==13514==    still reachable: 0 bytes in 0 blocks
==13514==         suppressed: 0 bytes in 0 blocks

(図131)

(補足)結果の見方について
・「loss record 1 of 1」の箇所で、割り当て1つに対して、解放が0である事を意味しています(「N of N」でN個の割り当てに対してN個の解放漏れの意味)。
・またメモリリークが発生したメモリの割り当て箇所についても結果に示されており、今回の例では「by 0x40059E: main (memorytest.cpp:5)」から5行目で発生している事が分かります。
 

(1-4) 例2:サンプルプログラム(Definetely Lost)

先程のプログラムに対して、メモリの解放を追記して「Definetely Lost」の状況をも改善したバージョンもご紹介します(delete []x1;を追記したのみです)。
 
(例2)
#include <stdlib.h>
int main()
{
    char *x1 = new char[100];
    delete []x1;

    return 0;
}

(図141)

メモリ解放を追記すると「still reachable」が表示されなくなりました。

(出力サンプル)

==32059== HEAP SUMMARY:
==32059==     in use at exit: 0 bytes in 0 blocks
==32059==   total heap usage: 1 allocs, 1 frees, 100 bytes allocated
==32059==
==32059== All heap blocks were freed -- no leaks are possible
==32059==
==32059== For lists of detected and suppressed errors, rerun with: -s
==32059== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

(図142)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++, Valgrind

執筆者:


comment

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

関連記事

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

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

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

C++の値渡しと参照渡しの使い分けや違いについて

<目次> (1) C++の値渡しと参照渡しの使い分けや違いについて  (1-1) 「値渡し」とは?  (1-2) 「参照渡し」とは?  (1-3) 「値渡し」と「参照渡し」の使い分け (1) C++の …

ポインタと参照の違いについてサンプルPGを使ってご紹介

  <目次> (1) ポインタと参照の違いについてサンプルPGを使ってご紹介  (1-1) ポインタと参照の概要  (1-2) 両者の違い①:宣言/初期化  (1-3) 両者の違い②:再代入 …

C++の動的メモリ割当と静的メモリ割当の違いについて

  <目次> (1) C++の動的メモリ割当と静的メモリ割当の違いについて  (1-1) 静的メモリ割当てとは?  (1-2) 動的メモリとは?  (1-3) 動的メモリの割当て  (1-4 …

  • English (United States)
  • 日本語
Top