我遇到了我的应用程序内存泄漏的情况。运行valgrind后,好像我遇到了与std :: string:
相关的内存泄漏 ==20274== 34 bytes in 1 blocks are definitely lost in loss record 34 of 140
==20274== at 0x4C29DB5: operator new(unsigned long) (vg_replace_malloc.c:332)
==20274== by 0x7F843C8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.13)
==20274== by 0x7F84DE4: ??? (in /usr/lib64/libstdc++.so.6.0.13)
==20274== by 0x7F84F32: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.13)
==20274== by 0xA50CC71: __static_initialization_and_destruction_0(int, int) (filename.cpp:22)
==20274== by 0xA50D03F: _GLOBAL__sub_I_filename.cpp (filename.cpp:112)
==20274== by 0x400E9CE: _dl_init (in /lib64/ld-2.12.so)
==20274== by 0x4000B69: ??? (in /lib64/ld-2.12.so)
有问题的代码是:
在filename.h中:
extern std::string aString;
在filename.cpp中:
std::string aString = "a string";
还要注意,这是在单独的命名空间中,即
namespace aNamespace {
//...
std::string aString; // in extern in .h
//...
}
在代码中的每个地方,(当然)被引用为:
aNamespace::aString;
据我所知,它永远不会重置,并且可以用作常量引用或初始化另一个字符串。
是否可能存在std :: string会导致内存泄漏的情况?
编辑:
valgrind输出的相关部分:
==20274== by 0x400EFBB: _dl_fini (in /lib64/ld-2.12.so)
==20274== by 0x88DAA01: exit (in /lib64/libc-2.12.so)
==20274== by 0x88C3D26: (below main) (in /lib64/libc-2.12.so)
这是打出电话吗?是标准出口(0)吗?
答案 0 :(得分:0)
如果在程序终止时仍然有一些堆分配的内存,但是没有变量保存指向它的指针,Valgrind会产生这种消息。 std :: string在其构造函数中分配内存以为char提供存储。析构函数应释放内存。
我的猜测是应用程序使用exit(0)终止。在这种情况下,堆栈不会展开,并且不会调用析构函数。