10

コードでメモリリークの問題が発生しています。実行中、ヒープが最大に増加し続け、サービスを再起動する必要があります。topコマンドを実行すると、サービスでシナリオを呼び出すたびにヒープが増加していることがわかります。

私はvalgrindでサービスを実行しました、

valgrind  --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice

iamがシナリオを実行している間、確実に失われた、または失われた可能性のあるブロックは表示されませんが、初期化されていない値のエラーに依存する条件付きジャンプまたは移動が多数表示されます。

これらはメモリリークの対象になりますか?

私が得ているものの例:

==27278== Conditional jump or move depends on uninitialised value(s)

==27278==    at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

.......。

==27278==  Uninitialised value was created by a heap allocation

==27278==    at 0x4A078B8: malloc (vg_replace_malloc.c:270)

==27278==    by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

誰かが助けることができますか。

4

3 に答える 3

16

いいえ、初期化されていないメモリにアクセスしていることを意味します。

int main()
{
     int unitialized;
     std::cout << unitialized << std::endl;
}

このエラーが発生します。

もう少し一般的なのは次のとおりです。

struct X 
{
     X() : i(42) { }
  private:
     int i;
     int* forgotten; // oops, not initialized
};

memset最後に、これは、バッファ全体をクリアするために使用しない場合、mallocベースのコードで頻繁に発生します。それで、

  1. mallocバッファサイズm
  2. 読み取り(ソケットからなど)nバイト
  3. mバイトをファイルに書き込みます。(mn)バイトは初期化されなかったでしょう
于 2013-02-19T08:07:43.043 に答える
5

これは、Valgrindユーザーマニュアルのセクション4.2.2で説明されています。初期化されていない値の使用

プログラムが初期化されていない値、つまり未定義の値を使用すると、初期化されていない値の使用エラーが報告されます。

..。

プログラムは、ジャンク(初期化されていない)データを好きなだけコピーできることを理解することが重要です。Memcheckはこれを監視し、データを追跡しますが、文句は言いません。苦情は、プログラムが初期化されていないデータを、プログラムの外部から見える動作に影響を与える可能性のある方法で利用しようとした場合にのみ発行されます。

于 2013-02-19T08:09:14.577 に答える
2

いいえ、これはメモリリークを直接示しているわけではありません。ただし、初期化されていない変数に依存する条件付きジャンプがあると、実質的に何にでもつながる可能性があります。一般に、初期化されていない変数を使用すると、未定義の動作が呼び出されます。

于 2013-02-19T08:08:22.363 に答える