std::strstreambuf::freeze
来自cppreference.com
| |
(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 对象,部分情况下会解分配字符数组 (虚公开成员函数) |
[虚] |
后附字符到输出序列,可能重分配或初始地分配缓冲区,若它为动态且未被冻结 (虚受保护成员函数) |