Valgrind error with std::cin

2019-09-04 05:22发布

问题:

Here is my code:

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

Valgrind throws an error on the line std::cin >> temp.

Here is the valgrind output for those who asked:

 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 is the second call to getword() in the program. That code reads

std::string network = getword();

netsim.cc:29 is the code for getword() itself. Line 29 is the line

std::cin >> temp

I still don't understand why this happened but I managed to resolve the issue. I had the code

std::string s = getword();

immediatly above

std::string network = getword();

I made both s and network global variables and somehow the issue was resolved.

If anyone can explain why that is though I would be grateful.

回答1:

I'm not a valgrind Expert, but I'm tentative to say that this is a false positive. In fact, it might even be a false positive generated by valgrind itself. Looking at the Leak Summary and seeing the core origin of the leak, I get suspicious:

// 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)

Now why would valgrind be reporting a memory leak from its own shared library ? Something doesn't seem right here. Either valgrind itself isn't very clean in how its allocating that memory (and valgrind has its own leak! Oh noes!) or it's throwing a really strange false positive. Unless the newest branches of GCC have produced a memory leak for std::string and the istream& operator<< recently, I can't imagine this actually leaking. std::cin and std::cout have been being used for ages, and it makes no sense that valgrind would toss an error over it, especially when your client code isn't making a single new/delete call.

So, in short, there's a few things that could be happening here:

  1. valgrind is leaking. (Maybe? It's originating from a valgrind function)
  2. GCC is leaking? (Hesitant to say this)
  3. valgrind is drunk! :[

In either case, ignore it and move on. I doubt this is going to shatter your netsim in any crucial way.

I hope it clears up soon, and I'm sorry my answer can only say this much, but these are the best shots I can give.