std :: string вызывает утечки памяти - PullRequest
0 голосов
/ 08 октября 2018

Я сталкиваюсь с ситуацией, когда у моего приложения есть утечки памяти.После запуска 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 вызывал бы утечки памяти?

edit:

Связанная часть вывода 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 голосов
/ 08 октября 2018

Valgrind выдает такие сообщения, если по завершении программы все еще есть выделенная куча памяти, но ни одна переменная не содержит указатель на.std :: string выделяет память в своем конструкторе, чтобы обеспечить хранение символов.Деструктор должен освободить память обратно.

Я предполагаю, что приложение завершается с использованием exit (0) или около того.В этом случае стек не разматывается, и деструкторы не вызываются.

...