返回 std::string 时出现瓦尔格林德内存泄漏
Valgrind memory leak when returning std::string
我正在我们的代码库上运行valgrind工具,我在下面的函数中看到许多内存泄漏。
std::string utils::toUtf8(const sdk::String& str)
{
ByteString byteStr = str.ToUtf8();
return std::string(byteStr.GetConstData());
}
- sdk::String 是我们的内部字符串对象表示形式。
- 斯特。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)
我无法理解为什么返回一个简单的字符串对象会泄漏内存。
鉴于您提供的信息有限,以下是我能找到的最好的信息。根据堆栈跟踪,泄漏的内存由 std::string(byteStr.GetConstData())
中的临时std::string
对象分配。所以问题与您的ByteString
无关.由于您按值临时返回 r 值,因此会发生移动构造。如果是 C++11 之前的编译器,会发生复制省略。在任何一种情况下,分配的内存都不会被 utils::toUtf8
内的临时释放。而是,释放内存的责任被转移到接收utils::toUtf8(...)
值的变量身上。也就是说,变量str
例如str = utils::toUtf8(...);
。总而言之,问题不在于utils::toUtf8
,而在于其他地方。
相关文章:
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 瓦尔格林德的内存泄漏使用新的
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 修复了瓦尔格林德错误内存泄漏的错误
- 为什么瓦尔格林德在这里看到内存泄漏,而没有
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 瓦尔格林德在组成中报告的内存泄漏
- 瓦尔格林德内存泄漏与动态数组C++
- C++内存泄漏,瓦尔格林德消息误导?
- 如何修复瓦尔格林德内存泄漏?
- 瓦尔格林德说malloc内存损坏,没有使用malloc
- 返回 std::string 时出现瓦尔格林德内存泄漏
- C++ 瓦尔格林德内存泄漏
- 如何追捕瓦尔格林德说不存在的内存泄漏?
- 瓦尔格林德报告内存泄漏,但我不明白它发生在哪里
- C++内存泄漏检查中的瓦尔格林德错误
- 检测"内存泄漏"时,瓦尔格林德的真实指针是什么?
- 内存泄漏/瓦尔格林德问题
- 瓦尔格林德内存泄漏
- 瓦尔格林德内存分析器结果