I am new to valgrind, so this may be an inaccurate output. Valgrind seems to think that bytes are lost in the following lines:
if ( mysqlpp::StoreQueryResult result = query.store() ){ for ( size_t i = 0; i < result.num_rows(); ++i ){ hash = std::string( result[i]["hash"].data(), result[i]["hash"].length() ); label = std::string( result[i]["label"].data(), result[i]["label"].length() ); keywords = std::string( result[i]["keywords"].data(), result[i]["keywords"].length() ); task_raw = std::string( result[i]["task"].data(), result[i]["task"].length() ); solution_raw = std::string( result[i]["solution"].data(), result[i]["solution"].length() );
In fact, it complains every time std :: string is created this way ^^. I cannot understand if this is false positive if the way I'm copying is the wrong way, or if the result is leaking somehow.
Interestingly, he complains about another piece of code that does not use mysql ++, but again uses the string constructor:
for ( auto & f : frames ){ for ( unsigned int i = 0; i < f.getTask().size(); i++ ){ if ( i + 1 < f.getTask().size() ){ auto t = f.getTask()[i].value(); auto n = f.getTask()[i+1].value(); pairs.push_back( std::string( t + n ) );
The line on which the line is built and discarded may be lost. Then it gives the detailed output of malloc, the new operator, std :: string, etc.
The same story appears again when copying a line from std :: istringstream:
std::copy( std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter<std::vector<std::string> >(tokens));
Are these false positives? Is this related to using C ++ 0x? Or are these legal leaks that may arise from a place where I have not yet discovered that it is leaking?
EDIT
Below is a sample valgrind re-warning:
==18141== 9,555 bytes in 147 blocks are possibly lost in loss record 250 of 256 ==18141== at 0x4C28BED: malloc (vg_replace_malloc.c:263) ==18141== by 0x7CA74C: operator new(unsigned long) (in trunk/Build/icarus) ==18141== by 0x7B4208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /trunk/Build/icarus) ==18141== by 0x7B5904: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in trunk/Build/icarus) ==18141== by 0x7B5A7C: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&) (in trunk/Build/icarus) ==18141== by 0x610D65: Frame::mySQLloadFrameFromExample(std::string const&) (Frame.cpp:80) ==18141== by 0x6103FB: Frame::Frame(std::string const&) (Frame.cpp:5) ==18141== by 0x6054DB: Domain::mySQLloadFrames() (Domain.cpp:90) ==18141== by 0x60489D: Domain::Domain(std::string) (Domain.cpp:7) ==18141== by 0x628876: DomainController::loadDomainData() (DomainController.cpp:33) ==18141== by 0x628582: DomainController::DomainController() (DomainController.cpp:5) ==18141== by 0x627002: Controller::Controller() (Controller.cpp:26)
Almost all of them are identical, with the only difference being that this is the actual line in the code (i.e. the line of the line constructor).
Second type of warning:
==18141== 3,562 bytes in 137 blocks are possibly lost in loss record 242 of 256 ==18141== at 0x4C28BED: malloc (vg_replace_malloc.c:263) ==18141== by 0x7CA74C: operator new(unsigned long) (in trunk/Build/icarus) ==18141== by 0x7B4208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in trunk/Build/icarus) ==18141== by 0x7B4EFA: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in trunk/Build/icarus) ==18141== by 0x7B4FDF: std::string::reserve(unsigned long) (in trunk/Build/icarus) ==18141== by 0x784F2F: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (in trunk/Build/icarus) ==18141== by 0x61208E: std::istream_iterator<std::string, char, std::char_traits<char>, long>::_M_read() (stream_iterator.h:121) ==18141== by 0x613405: std::istream_iterator<std::string, char, std::char_traits<char>, long>::operator++() (stream_iterator.h:95) ==18141== by 0x6131BC: std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > std::__copy_move<false, false, std::input_iterator_tag>::__copy_m<std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > >(std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > >) (stl_algobase.h:298) ==18141== by 0x612D09: std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > std::__copy_move_a<false, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > >(std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > >) (stl_algobase.h:384) ==18141== by 0x6121FD: std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > std::__copy_move_a2<false, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > >(std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > >) (stl_algobase.h:422) ==18141== by 0x611C6A: std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > std::copy<std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > > >(std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::istream_iterator<std::string, char, std::char_traits<char>, long>, std::back_insert_iterator<std::vector<std::string, std::allocator<std::string> > >) (stl_algobase.h:454)
Which is apparently related to the above std :: istringstream code.