简单的C++/valgrind问题我希望有人可以提供帮助.
当针对以下代码运行valgrind时,我得到两个与std :: string相关的可能泄漏:
==10325== 17 bytes in 1 blocks are possibly lost in loss record 1 of 2
==10325== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==10325== by 0x40CFD05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D0B10: ??? (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D0CF5: 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.13)
==10325== by 0x804872B: main (test.cc:9)
==10325==
==10325== 17 bytes in 1 blocks are possibly lost in loss record 2 of 2
==10325== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==10325== by 0x40CFD05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D0977: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D17AC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D1C7F: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x40D1D63: std::string::operator+=(std::string const&) (in /usr/lib/libstdc++.so.6.0.13)
==10325== by 0x804879D: main (test.cc:11)
Run Code Online (Sandbox Code Playgroud)
虽然抑制它们并不是太多的工作,并且代码对我来说似乎很简单,但我想确保在我尝试说服valgrind之前我不会错过任何明显的东西我知道我是什么这样做.
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main(int argc, char *argv[])
{
char buffer[8192];
sprintf(buffer, "ABCD");
std::string str(buffer);
std::string str2 = "";
str2 += str;
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
通过调用终止程序exit()实际上不是有序关闭,它基本上在当前位置中止程序.因此str,str2在程序终止之前不会被销毁,而valgrind会对此进行摧毁.
当您通过从main返回时正常退出程序时str,str2应该调用des的析构函数,并且报告的"内存泄漏"应该消失.
小智 6
另请注意,如果您正在使用libstdc++(用于Linux和某些BSD的标准c ++库),则应编译程序GLIBCXX_FORCE_NEW,以禁用std::string内存池优化,这看起来像是对valgrind的泄漏.请记住为您的发布版本转回去:-).