| I/O manipulators | ||||
| Print functions(C++23) | ||||
| C-style I/O | ||||
| Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
| Streams | ||||
| Abstractions | ||||
| File I/O | ||||
| String I/O | ||||
| Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
| Synchronized Output | ||||
(C++20) | ||||
| Types | ||||
| Error category interface | ||||
(C++11) | ||||
(C++11) |
| Public member functions | ||||
strstreambuf::~strstreambuf | ||||
| Protected member functions | ||||
virtual ~strstreambuf(); | (deprecated in C++98) (removed in C++26) | |
Destroys astd::strstreambuf object. if the object is managing a dynamically-allocated buffer (the buffer state is "allocated") and if the object is not frozen, then deallocates the buffer using the deallocation function provided at construction ordelete[] if none was provided.
(none)
This destructor is typically called by the destructor ofstd::strstream.
Ifstr() was called on a dynamicstrstream andfreeze(false) was not called after that, this destructor leaks memory.
#include <iostream>#include <strstream> void* my_alloc(size_t n){std::cout<<"my_alloc("<< n<<") called\n";return newchar[n];} void my_free(void* p){std::cout<<"my_free() called\n"; delete[](char*)p;} int main(){{std::strstreambuf buf(my_alloc, my_free);std::ostream s(&buf); s<<1.23<<std::ends;std::cout<< buf.str()<<'\n'; buf.freeze(false);}// destructor called here, buffer deallocated {std::strstreambuf buf(my_alloc, my_free);std::ostream s(&buf); s<<1.23<<std::ends;std::cout<< buf.str()<<'\n';// buf.freeze(false);}// destructor called here, memory leak!}
Output:
my_alloc(4096) called1.23my_free() calledmy_alloc(4096) called1.23