为什么此代码在g ++和clang(libstdc++)上成功运行,但在libc++时出现分段错误:
#include <iostream>
int main()
{
std::cout.tie(&std::cout);
std::cout << 123;
}
我认为应该发生的是std::cout.flush()
应该在输出实际发生之前调用。为什么会出现分段错误?
答案 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()
。 3243 [...]
324 不一定会发生呼叫
os.tie()->flush()
如果函数可以确定不需要同步。
如果你将一个流绑定到自身,然后刷新流,它会构造一个sentry
,它试图刷新流,构造一个sentry
,试图刷新流,构造一个sentry
,它试图刷新流,构造一个sentry
......我想你会看到它的发展方向。
如果你得到(非)幸运,实施可能会跳过每个脚注324的flush()
电话;否则,您将看到此网站的标题。