[Boost-bugs] [Boost C++ Libraries] #12296: boost::container::{deque, string} combine for a memory leak

Subject: [Boost-bugs] [Boost C++ Libraries] #12296: boost::container::{deque, string} combine for a memory leak
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-06-22 21:26:38


#12296: boost::container::{deque,string} combine for a memory leak
------------------------------------------+------------------------
 Reporter: Tavian Barnes <tavianator@…> | Owner: igaztanaga
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: container
  Version: Boost 1.61.0 | Severity: Problem
 Keywords: |
------------------------------------------+------------------------
 The following program leaks memory, according to valgrind. Switching
 either deque or string (or both) to the std:: implementation does not show
 the leak, so I'm not sure which container has the bug (though I suspect
 it's deque).

 {{{
 $ cat foo.cpp
 #include <boost/container/deque.hpp>
 #include <boost/container/string.hpp>
 #include <deque>
 #include <string>

 using boost::container::deque;
 using boost::container::string;
 // using std::deque;
 // using std::string;

 int main() {
   deque<string> foo;
   foo.push_back("------------------------");
   foo.push_back("------------------------");
   foo.erase(foo.begin(), foo.begin() + 1);
   return 0;
 }
 $ g++ -std=c++11 -g -Wall foo.cpp && valgrind --leak-check=full ./a.out
 ==29864== Memcheck, a memory error detector
 ==29864== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
 ==29864== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright
 info
 ==29864== Command: ./a.out
 ==29864==
 ==29864==
 ==29864== HEAP SUMMARY:
 ==29864== in use at exit: 72,752 bytes in 2 blocks
 ==29864== total heap usage: 5 allocs, 3 frees, 73,368 bytes allocated
 ==29864==
 ==29864== 48 bytes in 1 blocks are definitely lost in loss record 1 of 2
 ==29864== at 0x4C2B0D8: operator new(unsigned long) (in
 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
 ==29864== by 0x405A12:
 boost::container::new_allocator<char>::allocate(unsigned long)
 (new_allocator.hpp:145)
 ==29864== by 0x405047:
 boost::container::container_detail::allocator_version_traits<boost::container::new_allocator<char>,
 1u>::allocation_command(boost::container::new_allocator<char>&, unsigned
 int, unsigned long, unsigned long&, char*&)
 (allocator_version_traits.hpp:142)
 ==29864== by 0x404647:
 boost::container::container_detail::basic_string_base<boost::container::new_allocator<char>
>::allocation_command(unsigned int, unsigned long, unsigned long&, char*&)
 (string.hpp:276)
 ==29864== by 0x403823: boost::container::basic_string<char,
 std::char_traits<char>, boost::container::new_allocator<char>
>::priv_reserve(unsigned long, bool) (string.hpp:2494)
 ==29864== by 0x40250B: boost::container::basic_string<char,
 std::char_traits<char>, boost::container::new_allocator<char>
>::reserve(unsigned long) (string.hpp:1088)
 ==29864== by 0x401922: boost::container::basic_string<char,
 std::char_traits<char>, boost::container::new_allocator<char>
>::assign(char const*, char const*) (string.hpp:1401)
 ==29864== by 0x4011C9: boost::container::basic_string<char,
 std::char_traits<char>, boost::container::new_allocator<char>
>::basic_string(char const*) (string.hpp:707)
 ==29864== by 0x400D84: main (foo.cpp:13)
 ==29864==
 ==29864== LEAK SUMMARY:
 ==29864== definitely lost: 48 bytes in 1 blocks
 ==29864== indirectly lost: 0 bytes in 0 blocks
 ==29864== possibly lost: 0 bytes in 0 blocks
 ==29864== still reachable: 72,704 bytes in 1 blocks
 ==29864== suppressed: 0 bytes in 0 blocks
 ==29864== Reachable blocks (those to which a pointer was found) are not
 shown.
 ==29864== To see them, rerun with: --leak-check=full --show-leak-kinds=all
 ==29864==
 ==29864== For counts of detected and suppressed errors, rerun with: -v
 ==29864== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
 }}}

 (Ignore the "still reachable" blocks; those are from libstdc++ itself.)

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/12296>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:20 UTC