作者:手机用户2502875927 | 来源:互联网 | 2023-05-25 08:57
为什么这个代码在g ++和clang(libstdc ++)上成功运行,但是给libc ++一个分段错误:
#include
int main()
{
std::cout.tie(&std::cout);
std::cout <<123;
}
我认为应该发生的是std::cout.flush()
应该在输出实际发生之前调用.为什么会出现分段错误?
1> T.C...:
[ostream.unformatted]/P7:
basic_ostream& flush();
7效果:表现为无格式输出功能[...]
[ostream.unformatted]/P1:
每个未格式化的输出函数通过构造类的对象开始执行sentry
.
[ostream的::岗哨]/P2:
explicit sentry(basic_ostream& os);
2如果os.good()
非零,则准备格式化或未格式化的输出.如果os.tie()
不是空指针,则调用
os.tie()->flush()
.324
3 [...]
324os.tie()->flush()
如果函数可以确定不需要同步,则不一定会发生调用.
如果你将一个流绑定到自身,然后刷新流,它构造一个sentry
,它试图刷新流,构造一个sentry
,它试图刷新流,构造一个sentry
,试图刷新流,构造一个sentry
......我想你知道这是怎么回事.
如果你得到(非)幸运,实施可能会跳过flush()
每个脚注324 的呼叫; 否则,你会看到这个网站的标题.
它不会_anywhere_!