stringbuf::flush 何时被调用?

qdi*_*dii 1 c++ synchronization std stringbuffer

struct encrypt_stream : public std::stringbuf
{
    int sync() { encrypt_buffer(); flush_to_device(); }
    ...
private:
    void encrypt_buffer();
    void flush_to_device();
};
Run Code Online (Sandbox Code Playgroud)

我想编写这个类来加密文本数据。每次stringbuf刷新该对象时,sync都会调用该对象并将缓冲区的加密版本发送到设备。flush加密文本很大程度上取决于调用的时刻。是否存在flush不需要用户请求就可以调用该对象的棘手情况?

我知道收到flush后会被调用std::endl,但是还有其他我不知道的情况吗?

0x4*_*2D2 5

flush()在这些情况下被调用:

\n\n
    \n
  • 何时std::endl使用(即显式调用std::ostream::flush()) [\xc2\xa727.7.3.7/7]
  • \n
  • 当流的析构函数被调用时 [\xc2\xa727.5.3.1.6/4]
  • \n
  • 当它所指向的流tie()执行读取时。[\xc2\xa727.7.2.1.3/2]
  • \n
  • 当文件流重新定位时。
  • \n
  • 当流达到其缓冲区中分配的最大字符数时,overflow()调用when将内容提取到外部设备,[\xc2\xa727.6.3.4.5/3]
  • \n
  • 或者在输入流的情况下,当 时gptr() == egptr(),调用underflow()来丢弃内容并将其缓冲区与外部设备同步。[\xc2\xa727.6.3.4.3/7]
  • \n
\n\n

这就是我对标准 IOStreams 的了解。这可能会根据流或流缓冲区的实现而有所不同。

\n