3

最近、Boost TCP iostream を使用する必要があるため Ubuntu 12.04MSVC 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 のコンストラクターにあることがわかりましたsentrybasic_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 システムで同じ理由でクラッシュしますか?

4

0 に答える 0