2011-01-01 1 views
2

Простой вопрос с C++/valgrind Я надеюсь, что с кем-то может помочь.valgrind & C++: building std :: string from character buffers

При запуске Valgrind против следующего кода, я получаю два возможных утечек, связанных с STD :: строки:

==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) 

Хотя это не было бы слишком много работы, чтобы подавить их, и код кажется достаточно простым для меня, я хотел бы быть уверен, что я не пропущу что-то очевидное здесь, прежде чем я попытаюсь убедить 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); 
} 

ответ

7

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

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

+0

+1 хороший улов! – wilhelmtell

+0

Действительно. Большое спасибо! – cubic1271

6

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