最近、Boost TCP iostream を使用する必要があるため、 Ubuntu 12.04とMSVC 11.0 の g++ 4.6 (Visual Studio 2012 RC) を Windows 7 で実行します。プログラムは Linux で期待どおりにコンパイルおよび実行されます。そのことから、boost の例のソース コードは完全に正しいと推測できるので、ここでは省略します。さらに、すべての MSVC プロジェクト設定とブースト バイナリへのリンクは問題ありません。これは、Microsoft によれば問題ないという警告 C4250 のみで正常にコンパイルされるためです。
問題は、サーバーとクライアントの両方が Windows での実行時にクラッシュし、エラーが0x000007FEEE9082DE (msvcp110d.dll) (***.exe) unhandled exception: 0xC00000FD: Stack overflow (arguement: 0x0000000000000001, 0x00000000000C3FF0)
デバッグのように見えることです。
サーバーをバックグラウンドで実行したままクライアントをデバッグしていると、スタック トレース
に呼び出し元のスタックが表示されました。ostream のソースを掘り下げたところ、in のコンストラクターにあることがわかりました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 システムで同じ理由でクラッシュしますか?