7

I am new to valgrind, so this could be missintepreting the output. Valgrind seems to think bytes are being 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 there is an std::string being constructed this way^^. I cannot figure out if this is a false-positive, if the way I'm copying is not the right way, or if the result is being leaked somehow.

Interestingly enough, it complains about another piece of code that doesn't use mysql++, but again a string constructor is used:

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 where a string is being constructed and pushed back, are possibly lost. Then a detailed output of malloc, operator new, std::string, etc are given.

The same story appears again, when copying a string from a std::istringstream:

std::copy( std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter<std::vector<std::string> >(tokens));

Are those false-positives? Does it have to do with using C++0x? Or are those legit leaks that may be originating from somewhere I have not yet detected to be leaking?

EDIT

Below is a sample of the reoccurring valgrind 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)

They are almost all identical, with the only difference being the actual line in code (i.e: the string constructor line).

The second type of warning is:

==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 seems to be related with the std::istringstream code mentioned above.

Ælex
  • 14,432
  • 20
  • 88
  • 129
  • 2
    Probably duplicate of http://stackoverflow.com/q/2996498/72178. Try solutions from this answer http://stackoverflow.com/a/2996672/72178. – ks1322 Jun 19 '13 at 15:31
  • I've tried: export GLIBCXX_FORCE_NEW=1 and export GLIBCPP_FORCE_NEW=1, as well as running valgrind --leak-check=yes, and I still get the same errors, although now they are being suppressed. – Ælex Jul 16 '13 at 17:53

0 Answers0