【发布时间】:2014-05-10 18:21:04
【问题描述】:
我在 Visual Studio 2013 中使用 MSVC。这是我正在编译的代码:
#include <iostream>
using namespace std;
void crash()
{
cout << "crash?" << endl;
system("PAUSE");
}
int main(int argc, char *argv[])
{
atexit(crash);
//while(true);
return 0;
}
现在的方式 - 它就像一个魅力。我启动程序,它进入崩溃功能,暂停,我按下一个键,它正常关闭。都很酷。但是,如果我取消注释 while 循环并使用控制台上的 X 按钮将其关闭,我会在 endl 函数中崩溃。我能够确定崩溃是由 _Ostr.widen() 这是MSVC提供的endl函数的实现:
template<class _Elem,
class _Traits> inline
basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
使用 Ctrl+C 终止程序会产生相同的效果。我该如何解决这个问题?
【问题讨论】:
-
在调用
atexit时,标准输出的句柄可能不再有效。 -
@chris 如果我只是跳过 '
-
可能是因为
endl刷新了流。 -
在异常状态下启动另一个分叉进程也可能是一个相当糟糕的主意!
-
好吧,拉起VS后,看起来是
widen调用。花了两秒钟告诉它调试,locale复制构造函数在_Ptr->Incref();上崩溃。
标签: c++ crash cout ostream atexit