返回std :: string

时间:2015-04-22 13:15:26

标签: c++ memory-leaks valgrind

我在我们的代码库上运行valgrind工具,我在下面的函数中看到了很多内存泄漏。

std::string utils::toUtf8(const sdk::String& str)     
{
   ByteString byteStr = str.ToUtf8();
   return std::string(byteStr.GetConstData());    
}
  • sdk :: String是我们的内部字符串对象表示。
  • str.ToUtf8()返回一个ByteString对象,该对象在其生命周期后(在此函数结束时)释放内存。
  • getConstData()返回一个指向上述ByteString对象内容的const char指针

下面是回溯

==2833== 3,830 bytes in 160 blocks are definitely lost in loss record 33,600 of 34,381
==2833==    at 0x40084DA: malloc (vg_replace_malloc.c:296)
==2833==    by 0x43898CC: SCHeapAlloc (in /opt/sw/libSystemCommon-2.7.so)
==2833==    by 0x459BCF64: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.17)
==2833==    by 0x459BEE9D: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/libstdc++.so.6.0.17)
==2833==    by 0x459BF59A: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.17)
==2833==    by 0x1359C87B: utils::toUtf8(sdk::String const&) (String.cpp:17)

我无法理解为什么返回一个简单的字符串对象会泄漏内存。

1 个答案:

答案 0 :(得分:1)

鉴于您提供的信息有限,以下是我能够达到的最佳信息。根据堆栈跟踪,泄漏的内存由std::string中的临时std::string(byteStr.GetConstData())对象分配。所以这个问题与你的ByteString无关。由于您按值临时返回r值,因此移动构造发生。如果是C ++ 11之前的编译器,则会发生copy elision。在任何一种情况下,分配的内存都不会被utils::toUtf8内的临时释放。但是,释放内存的责任转移到接收utils::toUtf8(...)值的变量。也就是说,str中的变量str = utils::toUtf8(...);。总之,问题不在utils::toUtf8,而在其他地方。