2014-09-03 2 views
2

Я использую Valgrind (инструмент для утечки памяти), чтобы найти потенциальную утечку памяти. Он был запущен как таковой:Интерпретация Valgrind Memory Leak Summary Log

$ Valgrind --leak проверка = сообщалось полный ./myApp

Следующая:

==9458== 15,007 bytes in 126 blocks are possibly lost in loss record 622 of 622 
==9458== at 0x4029FDE: operator new(unsigned int) (vg_replace_malloc.c:313) 
==9458== by 0x415F213: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) 
==9458== by 0x4161125: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) 
==9458== by 0x41617AF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) 
==9458== by 0x808B061: Parser::parseLinear(rapidxml::xml_node<char>*, Linear*) (Parser.cpp:663) 

==9458== 
==9458== LEAK SUMMARY: 
==9458== definitely lost: 0 bytes in 0 blocks 
==9458== indirectly lost: 0 bytes in 0 blocks 
==9458==  possibly lost: 20,747 bytes in 257 blocks 
==9458== still reachable: 57,052 bytes in 3,203 blocks 
==9458==   suppressed: 0 bytes in 0 blocks 
==9458== Reachable blocks (those to which a pointer was found) are not shown. 
==9458== To see them, rerun with: --leak-check=full --show-leak-kinds=all 
==9458== 
==9458== For counts of detected and suppressed errors, rerun with: -v 
==9458== ERROR SUMMARY: 21 errors from 21 contexts (suppressed: 0 from 0) 

Похоже, что это «возможно, потерял» утечка памяти основанный на сводке. Однако, после отслеживания строки 663 в Parser.cpp, я не могу определить проблему. xml_node <> * является частью библиотеки с открытым исходным кодом RapidXML. Исходный код выглядит следующим образом:

line 661: Tracker track; 
line 662: xml_node<>* trackingNode = node->first_node(); // rapidxml API 
line 663: track.setValue(trackingNode->first_node()->value()); 

Где SetValue определяется как:

void Tracker::setValue(const string& s) { 
    this->val = s; 
} 
+0

Является ли 'setValue()' inlined? Является ли 'val'' строкой'? – jxh

+0

Привет jxh, да val - это строка. setValue на самом деле является функцией-членом класса. Он должен выглядеть так: void myClass :: setValue (const string & s) – codeshark

+0

Является ли метод 'setValue()' определен в заголовочном файле класса или явно объявлен 'inline' или определен в месте, где его исходный объект уже проанализирован компилятором при компиляции строки 663? Я хочу знать, встал ли вызов функции. – jxh

ответ

1

Согласно rapidxml manual, xml_base::value() не возвращает завершается нулем строку с параметром rapidxml::parse_no_string_terminators.

Завершите свою строку в соответствии с xml_base::value_size(), если этот параметр установлен.

Кроме того, перед вызовом xml_base :: value() проверьте, не пустое значение. В другом случае value() возвращает пустую строку, которая может быть другой проблемой утечки памяти.

+0

Как получается, что длина строки завершает что-то? –

+0

Например: if (trackingNode-> first_node() -> value_size()) track.setValue (string(). Append (trackingNode-> first_node() -> value(), trackingNode-> first_node() -> value_size()) – ralv

+0

Лучше после вашего редактирования. BTW 'string' имеет ctor для этого: нет необходимости в' append'. –