使用字符串流将stderr重定向到stdout

Pra*_*van 5 c++ io stringstream

我有这样的代码

int main()
{
    std::stringstream oss;
    std::cerr.rdbuf( oss.rdbuf() );

    std::cerr << "this goes to cerr";
    std::cout << "[" << oss.str() << "]";
}
Run Code Online (Sandbox Code Playgroud)

但我得到的程序输出为

[this goes to cerr]Segmentation fault
Run Code Online (Sandbox Code Playgroud)

该程序如何进行分段?

Bjö*_*lex 12

这是因为cerr在程序退出之前不会恢复缓冲区.像这样做:

#include <iostream>
#include <sstream>

int main()
{
  std::stringstream oss;
  std::streambuf* old = std::cerr.rdbuf( oss.rdbuf() );

  std::cerr << "this goes to cerr";
  std::cout << "[" << oss.str() << "]";
  std::cerr.rdbuf(old);
}
Run Code Online (Sandbox Code Playgroud)

请参阅我的这个答案以获得异常安全的解决方案.