Valgrind を使用して C/C++ でメモリ リークを検出する方法

Valgrind Wo Shi Yongshite C C Dememori Rikuwo Jian Chusuru Fang Fa



Valgrind は、主に C、C++、およびその他の言語で記述されたソフトウェア プログラムのデバッグとプロファイリングに広く使用されているツールです。これは、開発者がメモリ リークを検出し、メモリ アクセス エラーを追跡し、プログラムの実行をプロファイリングするのに役立ちます。

Valgrind でプログラムを実行すると、プログラムの実行可能ファイルが動的にインストルメントされ、プログラムのメモリ使用量と実行動作を監視できるようになります。

C++ でのメモリ リーク

Valgrind は主に C および C++ プログラム用に設計されており、他の言語やすべてのシナリオでは効果的に機能しない可能性があることに注意することが重要です。さらに、Valgrind でプログラムを実行すると、実行速度が大幅に低下する可能性があるため、運用環境ではなく開発やデバッグ中によく使用されます。







動的に作成されたメモリが適切に解放されないと、C/C++ でメモリ リークが発生し、利用可能なメモリ リソースが徐々に消耗されてしまう可能性があります。これにより、メモリが過剰に消費され、プログラムのパフォーマンスが低下する可能性があります。



Valgridのインストール

Linux システムに Valgrind をインストールするには、ターミナルを開き、Linux ディストリビューションに固有のパッケージ マネージャーを使用してパッケージ リポジトリを更新します。次のコマンドは、Ubuntu および Debian ベースのシステムで機能します。



$ 須藤 適切なアップデート

パッケージ マネージャーを使用して Valgrind をインストールします。繰り返しますが、コマンドは Linux ディストリビューションによって異なる場合があります。 Ubuntu および Debian ベースのシステムには次のコマンドを使用します。





$ 須藤 適切な インストール 選挙ゲート

プロンプトが表示されたら、ユーザー パスワードを入力し、「Enter」を押します。ソフトウェアをインストールするには、ユーザー アカウントに管理者権限が必要であることに注意してください。パッケージ マネージャーは、Valgrind を必要な依存関係とともにダウンロードしてインストールします。このプロセスには数分かかる場合があります。



インストール プロセスが完了したら、検証手順として次のコマンドを実行して、Valgrind が正常にインストールされたことを確認できます。

$ 選挙ゲート - バージョン

このコマンドは、Valgrind が正常にインストールされている場合、そのバージョン情報を表示します。

それでおしまい!これで、Valgrind が Linux システムにインストールされ、C/C++ プログラムのメモリ リークやその他の問題の分析とデバッグに使用できるようになります。

Ubuntuでのファイルの作成

プログラムの作業を開始するには、まず Ubuntu でファイルを作成する必要があります。ファイルの作成にはnanoテキストエディタを使用します。したがって、ターミナル上で次のようにコマンドを記述します。

$ ナノ ファイル1

ここで、nano は実行されているテキスト エディタの名前です。 「file1」引数は、nano テキスト エディターを使用して開くか作成するファイルの名前を表します。ファイルがすでに存在する場合、Nano は編集のためにファイルを開きます。そうでない場合は、指定された名前で新しいファイルが生成されます。そのようなファイルがないため、「file1」という名前で新しいドキュメントを作成します。

コマンドを実行すると、nano エディターが開き、「file1」ファイルの内容を入力または編集するための空のキャンバスが表示されます。エディターへの既存のコンテンツの入力または貼り付けを開始できます。

すべての前提条件が満たされたので、Valgrind を使用して C++ プログラムのメモリ リークを検出するサンプルをいくつか作成します。

例 1:

最初に提供する例は、C の ライブラリの「malloc」関数を使用した動的メモリ割り当ての簡単な例を示しています。

#include

整数 主要 (

{

チャー * ある = マロック ( 102 ;

戻る 0 ;

}

コードの内訳は次のとおりです。

まず、動的なメモリ割り当てと割り当て解除のための malloc などの関数を提供する標準ライブラリ ヘッダー ファイル をインクルードします。

int main() 行は main 関数を宣言します。次に、char *a = malloc(102); char* 型 (char へのポインタ) のポインタ変数 'a' を宣言します。 「malloc」関数を使用して、102 char 要素の配列 (合計 102 バイト) にメモリを動的に割り当てます。バイト単位で表されるメモリ割り当てサイズは、malloc 関数への入力として送信され、新しく作成されたメモリ ブロックへのポインタを出力します。 char* ポインタ「a」には、このポインタ値が割り当てられます。最後に「return 0;」です。 main関数の終了を意味します。

つまり、このコードは「malloc」を使用して 102 文字要素の配列にメモリを動的に割り当て、メモリ アドレスをポインタ「a」に割り当てます。ただし、このコードでは、割り当てられたメモリをいかなる方法でも使用または操作しておらず、free を使用したメモリの割り当て解除も含まれていないことに注意してください。

「-leak-check=full」オプションを指定して Valgrind を通じてこのプログラムを実行すると、メモリ リーク チェックが実行され、出力レポートが提供されます。

Valgrid によって生成される出力レポートは次のとおりです。

例 2:

この図を始めるにあたり、前に説明したように、最初に nano テキスト エディタを使用して次のコマンドを記述して「test2」ファイルを作成します。

$ ナノ テスト2

次に、Valgrind を使用してメモリ リークがあるかどうかを確認する C++ プログラムを作成します。

#include

#include

#include

const int a_s = 3000 ;

整数メイン ( ) {

整数 * ia = マロック ( のサイズ ( 整数 ) * として ) ;

のために ( int i = 0 ;私 < として; i++ ) {

それ [ = 私;

}

スランド ( 時間 ( ヌル ) ) ;

int rn = ランド ( ) % として;

プリントフ ( 「それ[%d]: %d \n 、ん、それ [ ) ;

戻る 0 ;

}

プログラムを進めていきましょう。

コードには必要なヘッダー ファイルが含まれており、値 3000 の定変数「a_s」を定義しています。 main() 関数内で、int* 型のポインタ「ia」が宣言され、メモリは「malloc」を使用して動的に割り当てられます。関数。 「sizeof(int) * a_s」式は、「a_s」個の整数を格納するために必要なメモリの合計を決定します。 「ia」配列のすべての要素は、対応するインデックス値を使用して「for」ループによって初期化されます。たとえば、ia[0] は 0、ia[1] は 1 などになります。

乱数ジェネレーターは、現在時刻を使用する「srand」関数を使用してシードされます。これにより、プログラムが実行されるたびに、ランダムな整数の一意のセットが生成されるようになります。 「rand」関数は乱数を生成し、「rn」には rand() % a_s の結果が代入されます。係数演算子「%」は、乱数の範囲を 0 から a_s – 1 までに制限します。これは、「ia」配列内の有効なインデックスに対応します。

最後に、プログラムは「printf」関数を使用して、「ia」配列のランダムに選択されたインデックス「rn」の値と、対応するインデックスを出力します。

Valgrind を通じてこのプログラムを実行すると、次の出力レポートが生成されます。

  自動的に生成されたコンピューター プログラムの説明のスクリーンショット

結論

C++ プログラムのメモリ リークを検出するために Valgrind ツールが使用されていることを発見しました。 Valgrind のインストール ガイドが最初に提供されます。その後、nano テキスト エディターを使用して Ubuntu でファイルを作成する方法について詳しく説明しました。最後に、これらの前提条件を使用して 2 つの C++ サンプルを実行し、メモリ リークをチェックしました。 Valgrind によって生成されたレポートも添付されており、提供されたファイル内のメモリ リークが示されます。