0

C++11threadクラスを使用してスレッドを作成しましたが、スレッドをループでスリープさせたいです。関数が呼び出されると、次
のような例外が発生します。this_thread::sleep_for()

実行時チェックの失敗 #2 - 変数 '_Now' の周りのスタックが壊れていました。

私のコードは以下の通りです:

std::chrono::milliseconds duration( 5000 );
while (m_connected)
{
    this->CheckConnection();
    std::this_thread::sleep_for(duration);
}
4

1 に答える 1

0

_Nowの実装のどこか深いところにあるローカル変数だと思いますsleep_for。破損した場合は、その関数にバグがある (可能性は低い) か、アプリケーションの他の部分がダングリング ポインターに書き込んでいる (可能性が高い) かのいずれかです。

最も可能性の高い原因は、 を呼び出す少し前に、sleep_forこのスレッドがスリープしている間、他のスレッドによって書き込まれ、残っているローカル変数へのポインターを与えることです。

Linux を使用している場合は、valgrindを試すことをお勧めします(ただし、スタックへの無効なアクセスをキャッチできるかどうかはわかりません) が、Windows では、この種の問題をデバッグするためのツールについて知りません。慎重にレビューを行い、機能のさまざまな部分を無効にして、問題がいつ解消されるかを確認し、問題の可能性がある場所を絞り込むことができます。

私も以前はdumaライブラリを使用してある程度成功していましたが、スタックではなくヒープへの無効なアクセスしかキャッチできません。

注: clang と gcc はどちらも MSVC++ よりも C++11 の実装が進んでいるため、Windows 固有のものをあまり使用しない場合は、簡単に移植して valgrind を試すことができます。Gcc と特に clang は、MSVC++ よりもはるかに優れた静的診断を提供することでも知られているため、gcc または clagn でコンパイルすると、問題を指摘する警告が表示される場合があります。

于 2013-06-13T09:51:44.577 に答える