1

これが私のコードです:

 std::string getword()
 {
  std::string temp;
  std::cin >> temp;
  return temp;
 } 

Valgrind は、行 std::cin >> temp でエラーをスローします。

尋ねた人のためのvalgrind出力は次のとおりです。

 HEAP SUMMARY:
==18490==     in use at exit: 33 bytes in 1 blocks
==18490==   total heap usage: 397 allocs, 396 frees, 12,986 bytes allocated
==18490== 
==18490== 33 bytes in 1 blocks are possibly lost in loss record 1 of 1
==18490==    at 0x4C2AF8E: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18490==    by 0x4EEE3B8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==18490==    by 0x4EEF127: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==18490==    by 0x4EEF20F: std::string::reserve(unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==18490==    by 0x4EA7D14: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char,     std::char_traits<char>, std::allocator<char> >&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)
==18490==    by 0x401681: getword() (netsim.cc:29)
==18490==    by 0x401F6E: main (netsim.cc:96)
==18490== 
==18490== LEAK SUMMARY:
==18490==    definitely lost: 0 bytes in 0 blocks
==18490==    indirectly lost: 0 bytes in 0 blocks
==18490==      possibly lost: 33 bytes in 1 blocks
==18490==    still reachable: 0 bytes in 0 blocks
==18490==         suppressed: 0 bytes in 0 blocks
==18490== 
==18490== For counts of detected and suppressed errors, rerun with: -v
==18490== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)

netsim.cc:96 は、プログラム内の getword() への 2 番目の呼び出しです。そのコードは読み取ります

std::string network = getword();

netsim.cc:29 は getword() 自体のコードです。29行目は

std::cin >> temp

なぜこれが起こったのかはまだわかりませんが、問題を解決することができました。私はコードを持っていた

std::string s = getword();

すぐ上

std::string network = getword();

s とネットワークの両方のグローバル変数を作成しましたが、どういうわけか問題は解決しました。

誰かがその理由を説明できれば幸いです。

4

1 に答える 1

0

私はvalgrind専門家ではありませんが、これは偽陽性であると暫定的に述べています。実際、それ自体が生成した誤検出でさえある可能性がありますvalgrind。リークの概要を見て、リークの核心的な起源を見て、私は疑わしいと思います:

// The one right below this, that's at the top of that valgrind error
==18490==    at 0x4C2AF8E: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==18490==    by 0x4EEE3B8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17)

では、valgrind が独自の共有ライブラリからメモリ リークを報告するのはなぜでしょうか? ここで何かが正しくないようです。valgrind 自体がそのメモリを割り当てる方法があまりきれいではない (そして valgrind には独自のリークがあります! いやいや!) か、本当に奇妙な誤検知をスローしています。GCC の最新のブランチで std::string とistream& operator<<最近のメモリ リークが発生していない限り、これが実際にリークしているとは想像できません。特にクライアントコードが単一の新規/削除呼び出しを行っていない場合は、エラーが発生することはstd::cin意味std::coutがありません。valgrind

要するに、ここで発生する可能性のあることがいくつかあります。

  1. valgrind が漏れています。(たぶん?それはvalgrind関数に由来しています)
  2. GCC がリークしていますか? (これを言うのをためらう)
  3. valgrind酔っている!:[

いずれにせよ、それを無視して先に進みます。netsimこれが決定的な方法であなたを粉砕することになるとは思えません。

すぐに晴れることを願っています。私の答えがこれだけしか言えなくて申し訳ありませんが、これらは私が与えることができる最高のショットです.

于 2013-04-15T05:19:40.977 に答える