将流绑定到自身

时间:2015-01-25 23:36:20

标签: c++ c++11 iostream

为什么此代码在g ++和clang(libstdc++)上成功运行,但在libc++时出现分段错误:

#include <iostream>

int main()
{
    std::cout.tie(&std::cout);
    std::cout << 123;
}

我认为应该发生的是std::cout.flush()应该在输出实际发生之前调用。为什么会出现分段错误?

1 个答案:

答案 0 :(得分:5)

[ostream.unformatted] / P7:

basic_ostream& flush();
     

7效果:表现为无格式输出函数[...]

[ostream.unformatted] / P1:

  

每个未格式化的输出函数通过构造一个来开始执行   班级sentry的对象。

[ostream的::岗哨] / P2:

explicit sentry(basic_ostream<charT,traits>& os);
     

2如果os.good()非零,请准备格式化或未格式化   输出。如果os.tie()不是空指针,则调用   os.tie()->flush() 324

     

3 [...]

     

324 不一定会发生呼叫os.tie()->flush()   如果函数可以确定不需要同步。

如果你将一个流绑定到自身,然后刷新流,它会构造一个sentry,它试图刷新流,构造一个sentry,试图刷新流,构造一个sentry,它试图刷新流,构造一个sentry ......我想你会看到它的发展方向。

如果你得到(非)幸运,实施可能会跳过每个脚注324的flush()电话;否则,您将看到此网站的标题。