2014-09-03 22 views
2

我正在使用Valgrind(内存泄漏工具)来查找潜在的内存泄漏。它运行这样:解释Valgrind内存泄漏摘要日志

$的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) 

它看起来像有一个“可能失去”内存泄漏基于总结。但是,在Parser.cpp中追踪第663行后,我似乎无法确定问题。 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()是否内联? 'val'是'串'吗? – jxh 2014-09-03 19:21:57

+0

嗨jxh,是val是一个字符串。 setValue实际上是一个类的成员函数。它应该看起来像这样:void myClass :: setValue(const string&s) – codeshark 2014-09-03 19:23:59

+0

setValue()方法是在类的头文件中定义的,还是显式声明为inline,或者在其源代码体中定义在编译663行时,编译器已经解析了它?我想知道函数调用是否被内联。 – jxh 2014-09-03 19:29:26

回答

1

按照rapidxml manualxml_base::value()不与rapidxml::parse_no_string_terminators选项返回0结尾的字符串。

如果设置了此选项,则根据xml_base::value_size()终止您的字符串。

另外,在调用xml_base :: value()之前,检查该值是否为空。在其他情况下,value()返回可能是另一个内存泄漏问题的空字符串。

+0

如何获取字符串的长度终止某事? – 2014-09-03 22:25:38

+0

例如:if(trackingNode-> first_node() - > value_size())track.setValue(string()。append(trackingNode-> first_node() - > value(),trackingNode-> first_node() - > value_size() ); – ralv 2014-09-03 22:51:06

+0

编辑后效果更好。顺便提一句'string'有一个ctor可以这样做:不需要'append'。 – 2014-09-04 00:22:44