2013-04-15 2 views
0

Вот мой код:Valgrind ошибка с станд :: CIN

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

Valgrind выдает ошибку на темп линии станд :: CIN >>.

Вот выход 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() в программе. Этот код читает

std::string network = getword(); 

netsim.cc:29 - это код для самого getword(). Строка 29 - линия

std::cin >> temp 

Я все еще не понимаю, почему это произошло, но мне удалось решить проблему. я имел код

std::string s = getword(); 

выше

немедленно
std::string network = getword(); 

Я сделал оба с и сетевые глобальные переменные и как-то этот вопрос был решен.

Если кто-нибудь может объяснить, почему это было, хотя я был бы благодарен.

+1

Какая ошибка - вам не кажется, что вы должны добавить эту информацию на этот вопрос? – user93353

+2

Я согласен с @ user93353. «Valgrind бросает ошибку» не особенно полезно. Помните, редактируйте свой пост, чтобы положить его на нас? <3 – 2013-04-15 04:55:07

ответ

0

Я не эксперт valgrind, но я имею в виду сказать, что это ложный позитив. Фактически, это может быть даже ложный положительный результат, созданный самим valgrind. Глядя на Резюме Leak и видя основной источник утечки, я получаю подозрительный:

// 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 есть своя утечка! Oh noes!), Или это бросает действительно странный ложный позитив. Если только новейшие ветви GCC не произведут утечку памяти для std :: string и istream& operator<<, я не могу представить, что это действительно утечка. std::cin и std::cout используются в течение целых веков, и нет никакого смысла в том, что valgrind переведет ошибку, особенно если ваш клиентский код не делает ни одного нового вызова/удаления.

Так, в общем, есть несколько вещей, которые можно было бы случающиеся здесь:

  1. Valgrind протекает. (Может быть, это происходит из функции valgrind)
  2. GCC протекает? (Hititant сказать это)
  3. valgrind is пьяный! : [

В любом случае игнорируйте его и продолжайте движение. Я сомневаюсь, что это разрушит ваш netsim любым важным способом.

Надеюсь, он скоро прояснится, и я сожалею, что мой ответ может только так сказать, но это лучшие снимки, которые я могу дать.

Смежные вопросы