std::strstreambuf::freeze
来自cppreference.com
< cpp | io | strstreambuf
void freeze( bool freezefl = true ); |
||
若缓冲区使用动态分配,则设置流的冻结状态为 freezefl
。
流冻结时, overflow() 不会重分配缓冲区,而析构函数不会解分配缓冲区(因而导致内存泄漏)。
参数
freezefl | - | 设置冻结状态到的新值 |
返回值
(无)
注意
每次对 str() 的调用都冻结流,以保持其所返回的指针的合法性。为允许析构函数解分配缓冲区,需要显式调用 freeze(false) 。
示例
此示例中,底层数组的初始分配为 16 字节
运行此代码
#include <strstream> #include <iostream> int main() { { std::strstream dyn; // 动态分配的读/写缓冲区 dyn << "Test: " << 1.23; // 注意:无 std::ends ,以演示后附行为 std::cout << "dynamic buffer holds " << dyn.pcount() << " characters: '"; std::cout.write(dyn.str(), dyn.pcount()) << "'\n"; // 缓冲区现在冻结,进一步输出将不使缓冲区增长 dyn << "more output, hopefully enough to run out of the allocated space" << std::ends; std::cout << "After more output, it holds " << dyn.pcount() << " characters: '" << dyn.str() << "'\n"; dyn.freeze(false); // 在析构函数前解冻 } // 析构函数释放内存 { char arr[20]; std::ostrstream st(arr, sizeof arr); // 固定大小缓冲区 st << 1.23; // 注意:无 std::ends ,以演示后附行为 std::cout << "static buffer holds " << st.pcount() << " characters: '"; std::cout.write(st.str(), st.pcount()); std::cout << "'\n"; st << "more output, hopefully enough to run out of the allocated space" << std::ends; std::cout << "static buffer holds " << st.pcount() << " characters: '"; std::cout.write(st.str(), st.pcount()); std::cout << "'\n"; } // 无待解分配者,无需解冻 }
输出:
dynamic buffer holds 10 characters: 'Test: 1.23' After more output, it holds 16 characters: 'Test: 1.23more o' static buffer holds 4 characters: '1.23' static buffer holds 20 characters: '1.23more output, hop'
参阅
禁用/启用自动解分配 ( std::strstream 的公开成员函数) | |
禁用/启用自动解分配 ( std::ostrstream 的公开成员函数) | |
[虚] |
销毁 strstreambuf 对象,部分情况下会解分配字符数组 (虚公开成员函数) |
[虚] |
后附字符到输出序列,可能重分配或初始地分配缓冲区,若它为动态且未被冻结 (虚受保护成员函数) |