valgrind & C ++: сборка std :: string из символьных буферов - PullRequest
2 голосов
/ 01 января 2011

Простой вопрос 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)

Хотя подавить их не составит труда, а код кажется мне достаточно простым, но я хотел бы убедиться, что здесь не упущено что-то очевидное, прежде чем попытаться убедить Вальгринда в том, что я знаю, чтоЯ делаю.

#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);
}

Ответы [ 2 ]

7 голосов
/ 02 января 2011

Завершение программы вызовом exit() на самом деле не является корректным завершением работы, оно в основном прерывает программу в текущем месте.Поэтому str и str2 не уничтожаются до завершения программы, и valgrind подхватывает это.

Когда вы обычно выходите из программы, просто возвращаясь из main, деструкторы для str и str2 должныпозвоните, и сообщенные "утечки памяти" должны исчезнуть.

6 голосов
/ 03 октября 2011

Также обратите внимание, что если вы используете libstdc++ (стандартная библиотека c ++ для Linux и некоторых BSD), вы должны скомпилировать вашу программу с GLIBCXX_FORCE_NEW, чтобы отключить std::string оптимизацию пула памяти, которая выглядит как утечка в valgrind,Не забудьте отключить это для ваших сборок релиза :-).

...