最近我需要使用boost TCP iostream,所以我一直在尝试编译boost(v1.50.0)异步I / iostream server中的白天client和example O在Windows 7上同时使用Ubuntu 12.04上的g ++ 4.6和MSVC 11.0(Visual Studio 2012 RC)。该程序在Linux上按预期编译和运行。从那以后我们可以推断出boost例子的源代码完全正确,所以我不会在这里简短地说过。此外,所有MSVC项目设置和提升二进制文件的链接都可以,因为只有according to Microsoft的警告C4250才能正常编译。
问题是服务器和客户端在Windows上运行时崩溃,并且在调试中错误类似于0x000007FEEE9082DE (msvcp110d.dll) (***.exe) unhandled exception: 0xC00000FD: Stack overflow (arguement: 0x0000000000000001, 0x00000000000C3FF0)
。
当我离开服务器运行后台并且正在调试客户端时,堆栈跟踪
显示了调用堆栈。我挖掘了ostream的源代码,发现sentry
中basic_ostream
的构造函数
explicit __CLR_OR_THIS_CALL sentry(_Myt& _Ostr)
: _Sentry_base(_Ostr)
{ // construct locking and testing stream
if (_Ostr.good() && _Ostr.tie() != 0)
_Ostr.tie()->flush();
_Ok = _Ostr.good(); // store test only after flushing tie
}
是否有来电_Ostr.tie()->flush()
和flush()
_Myt& __CLR_OR_THIS_CALL flush()
{ // flush output stream
if (_Myios::rdbuf() != 0)
{ // buffer exists, flush it
const sentry _Ok(*this);
if (_Ok && _Myios::rdbuf()->pubsync() == -1)
_Myios::setstate(ios_base::badbit); // sync failed
}
return (*this);
}
构造一个恒定的哨兵_Ok
。我认为这是一个错误,但我不确定。
所以我的问题是你认为这是MSVC 11.0的运行时错误吗?服务器或客户端,如果使用MSVC 10.0(Visual Studio 2010)进行编译,是否会因为同样的原因在Windows系统上崩溃?