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