diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2002-05-15 13:15:17 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2002-05-15 13:15:17 +0000 |
commit | fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9 (patch) | |
tree | d56638b81fddc1100b68993d28c9cb43e8645e99 | |
parent | bf6f276b01d364d1fe300732d39a56f4a6f4ee34 (diff) | |
download | gcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.zip gcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.tar.gz gcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.tar.bz2 |
re PR libstdc++/6594 (strstreambuf leaks 16 bytes - gcc 3.0.x)
2002-05-15 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/6594
* src/strstream.cc (strstreambuf): Fix leak.
From-SVN: r53486
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/src/strstream.cc | 35 |
2 files changed, 26 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d6fc098..4018151 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2002-05-15 Benjamin Kosnik <bkoz@redhat.com> + + PR libstdc++/6594 + * src/strstream.cc (strstreambuf): Fix leak. + 2002-05-15 Paolo Carlini <pcarlini@unitus.it> PR libstdc++/6648 diff --git a/libstdc++-v3/src/strstream.cc b/libstdc++-v3/src/strstream.cc index 2160c44..7bd8d9c 100644 --- a/libstdc++-v3/src/strstream.cc +++ b/libstdc++-v3/src/strstream.cc @@ -64,13 +64,13 @@ strstreambuf::strstreambuf(streamsize initial_capacity) _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(true), _M_frozen(false), _M_constant(false) { - streamsize n = max(initial_capacity, streamsize(16)); - - char* buf = _M_alloc(n); - if (buf) { - setp(buf, buf + n); - setg(buf, buf, buf); - } + _M_buf_size = _M_buf_size_opt = max(initial_capacity, streamsize(16)); + _M_buf = _M_alloc(_M_buf_size); + if (_M_buf) + { + setp(_M_buf, _M_buf + _M_buf_size); + setg(_M_buf, _M_buf, _M_buf); + } } strstreambuf::strstreambuf(void* (*alloc_f)(size_t), void (*free_f)(void*)) @@ -78,12 +78,12 @@ strstreambuf::strstreambuf(void* (*alloc_f)(size_t), void (*free_f)(void*)) _M_alloc_fun(alloc_f), _M_free_fun(free_f), _M_dynamic(true), _M_frozen(false), _M_constant(false) { - streamsize n = 16; - - char* buf = _M_alloc(n); - if (buf) { - setp(buf, buf + n); - setg(buf, buf, buf); + _M_buf_size = _M_buf_size_opt = 16; + _M_buf = _M_alloc(_M_buf_size); + if (_M_buf) + { + setp(_M_buf, _M_buf + _M_buf_size); + setg(_M_buf, _M_buf, _M_buf); } } @@ -139,7 +139,14 @@ strstreambuf::strstreambuf(const unsigned char* get, streamsize n) strstreambuf::~strstreambuf() { if (_M_dynamic && !_M_frozen) - _M_free(eback()); + { + char* p = this->eback(); + _M_free(p); + if (p == _M_buf) + _M_buf = 0; + } + if (_M_buf) + _M_free(_M_buf); } void strstreambuf::freeze(bool frozenflag) |