std :: string导致内存泄漏

时间:2018-10-08 16:37:27

标签: c++ memory-leaks stl valgrind

我遇到了我的应用程序内存泄漏的情况。运行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)吗?

1 个答案:

答案 0 :(得分:0)

如果在程序终止时仍然有一些堆分配的内存,但是没有变量保存指向它的指针,Valgrind会产生这种消息。 std :: string在其构造函数中分配内存以为char提供存储。析构函数应释放内存。

我的猜测是应用程序使用exit(0)终止。在这种情况下,堆栈不会展开,并且不会调用析构函数。