Opened 9 years ago

Last modified 9 years ago

#9830 new Bugs

memory leak in time_duration

Reported by: mm@… Owned by: az_sw_dude
Milestone: To Be Determined Component: date_time
Version: Boost 1.54.0 Severity: Problem
Keywords: Cc:

Description

Hi folks, this is a leak i've found compiling this very single line: boost::posix_time::time_duration td(1,0,0,0); cout << td;

valgrind reports the following leak: ==16902== 25 bytes in 1 blocks are possibly lost in loss record 21 of 29 ==16902== at 0x40290AC: operator new(unsigned int) (vg_replace_malloc.c:313) ==16902== by 0x455BB54: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) ==16902== by 0x455CC72: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) ==16902== by 0x455CD10: std::string::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) ==16902== by 0x455CF8C: std::string::append(char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19) ==16902== by 0x8079DE9: boost::date_time::time_facet<boost::posix_time::ptime, char, std::ostreambuf_iterator<char, std::char_traits<char> > >::time_facet(unsigned int) (in /home/marcos/release/sandbox/chutaygol) ==16902== by 0x8084086: std::basic_ostream<char, std::char_traits<char> >& boost::posix_time::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, boost::posix_time::time_duration const&)

I hope you find a bug with the help of my report Marcos Mayorga

Change History (2)

comment:1 by anonymous, 9 years ago

Valgrind's backtrace of the leak:

==17499==    at 0x40290AC: operator new(unsigned int) (vg_replace_malloc.c:313)
==17499==    by 0x465A9E4: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==17499==    by 0x43156DB: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/libjsoncpp.so.0.6.0)
==17499==    by 0x465CF8F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.19)
==17499==    by 0x80ABF31: boost::date_time::date_generator_formatter<boost::gregorian::date, char, std::ostreambuf_iterator<char, std::char_traits<char> > >::date_generator_formatter() (date_generator_formatter.hpp:73)
==17499==    by 0x80A5815: boost::date_time::time_facet<boost::posix_time::ptime, char, std::ostreambuf_iterator<char, std::char_traits<char> > >::time_facet(unsigned int) (time_facet.hpp:249)
==17499==    by 0x80A05F8: std::basic_ostream<char, std::char_traits<char> >& boost::posix_time::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, boost::posix_time::time_duration const&) (posix_time_io.hpp:193)

comment:2 by anonymous, 9 years ago

probably line 193 of posix_time_io.hpp

188	//instantiate a custom facet for dealing with times since the user
189	//has not put one in the stream so far. This is for efficiency
190	//since we would always need to reconstruct for every time period
191	//if the locale did not already exist. Of course this will be overridden
192	//if the user imbues as some later point.
193	custom_ptime_facet* f = new custom_ptime_facet();
194	std::locale l = std::locale(os.getloc(), f);
195	os.imbue(l);
196	f->put(oitr, os, os.fill(), td);
Note: See TracTickets for help on using tickets.