From Bugzilla Helper: User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 Description of problem: when allocating new string object small chunk of memory is allocated by the libstdc++.so.5 and never freed. The small test program (presented in additional information section) shows that behaviour. I used mtrace to check memory allocations, results are shown in Actual Resultes after Steps to Reproduce. Strings constructed with int-2-string conversions I used in logger class in a multithreaded program (nptl) and I have here huge memory consumption. Version-Release number of selected component (if applicable): glibc-2.3.3-27 How reproducible: Always Steps to Reproduce: 1.compile tst program (see Additional Information) by the command $ g++ -g -o tst -Wall -ansi -pedantic tst.cpp 2.setup environment variable for mtrace $ export MALLOC_TRACE=~/tr.txt 3.run tst program 4.examine tr.txt file and output of mtrace perl utility: $ mtrace tst tr.txt Actual Results: tr.txt file contains: = Start @ ./tst:[0x804a53d] + 0x915a378 0x1 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x9893ae] + 0x915a388 0x470 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x9893ae] + 0x915a800 0x280 <<<- here is the problem @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x987dd3] - 0x915a388 @ ./tst:[0x804a59e] + 0x915a388 0x1 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x9893ae] + 0x915aa88 0x470 @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x987dd3] - 0x915aa88 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x9893ae] + 0x915aa88 0x470 @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x987dd3] - 0x915aa88 Expected Results: release all memory when string object is destroyed. Additional info: // memory leak in strings --> test program #include <mcheck.h> // for mtrace utility #include <string> #include <sstream> #include <iostream> using namespace std; template< class T > // conversion of anything to string inline std::string _2string( const T& _t ) { ostringstream os; os << _t; return( os.str() ); }; class version { private: unsigned ver:8, // version number: 0-255 rel:8, // maintenance release: 0-255 patch:16; // patchlevel: 0-16355 public: version( int, int, int ); ~version(); string vstr; // version string in a form of "ver.rel.patch" }; // methods of class version version::version( int v, int r, int p ) { ver = v & 0x000000FF; rel = r & 0x000000FF; patch = p & 0x0000FFFF; malloc(1); // isolation of the problem vstr += _2string(v); malloc(1); // isolation of the problem vstr += string("."); vstr += _2string(r); vstr += string("."); vstr += _2string(p); } version::~version() { vstr.clear(); } int main() { mtrace(); class version vers( 0, 0, 99 ); cerr << "TEST version " << vers.vstr << endl; }
This has nothing to do with glibc. Reassign to gcc.
This is a known issue with the default allocator in gcc-3.[23].x. These limitations have been removed for 3.4.x series. There is a work-around, however: use basic_string<char_type, std::char_traits<char_type>, __new_alloc<char> > instead of std::string -benjamin
Fixed for gcc 3.4.