std::strstreambuf::freeze

来自cppreference.com
< cpp‎ | io‎ | strstreambuf
void freeze(bool freezefl =true);
(C++98 弃用)
(C++26 移除)

若缓冲区使用动态分配,则设置流的冻结状态为 freezefl

流冻结时,overflow() 不会重分配缓冲区,而析构函数不会解分配缓冲区(因而导致内存泄漏)。

目录

[编辑]参数

freezefl - 设置冻结状态到的新值

[编辑]返回值

(无)

[编辑]注解

每次对 str() 的调用都冻结流,以保持其所返回的指针的合法性。为允许析构函数解分配缓冲区,需要显式调用 freeze(false)

[编辑]示例

此示例中,底层数组的初始分配为 16 字节。

#include <iostream>#include <strstream>   int main(){{std::strstream dyn;// 动态分配的读/写缓冲区 dyn <<"Test: "<<1.23;// 注意:无 std::ends,以演示后附行为std::cout<<"动态缓冲区持有 "<< dyn.pcount()<<" 个字符: '";std::cout.write(dyn.str(), dyn.pcount())<<"'\n";// 缓冲区现在冻结,进一步输出将不使缓冲区增长 dyn <<"more output, hopefully enough to run out of the allocated space"<<std::ends;std::cout<<"进行更多输出后,它持有 "<< dyn.pcount()<<" 个字符: '"<< dyn.str()<<"'\n"; dyn.freeze(false);// 在析构函数前解冻}// 析构函数释放内存   {char arr[20];std::ostrstream st(arr, sizeof arr);// 固定大小缓冲区 st <<1.23;// 注意:无 std::ends,以演示后附行为std::cout<<"静态缓冲区持有 "<< st.pcount()<<" 个字符: '";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";}// 无待解分配者,无需解冻}

输出:

动态缓冲区持有 10 个字符: 'Test: 1.23' 进行更多输出后,它持有 16 个字符: 'Test: 1.23more o' 静态缓冲区持有 4 个字符: '1.23' 静态缓冲区持有 20 个字符: '1.23more output, hop'

[编辑]参阅

禁用/启用自动解分配
(std::strstream 的公开成员函数)[编辑]
禁用/启用自动解分配
(std::ostrstream 的公开成员函数)[编辑]
销毁 strstreambuf 对象,部分情况下会解分配字符数组
(虚公开成员函数)[编辑]
后附字符到输出序列,可能重分配或初始地分配缓冲区,若它为动态且未被冻结
(虚受保护成员函数)[编辑]
close