とあるアプリでプログラムを開始した直後に Ctrl+C で割り込みを発生させると、
5割の確率で落ちて、そのうち 0.1 割ぐらいの確率で
R6025 pure virtual function call
が出てしまう。なお Ctrl+C シグナルではフラグをオンにするだけで、フラグが
立っていたらメインループを脱出するロジックにしている。
pure virtual function call が出るなら、再現性100%じゃないとおかしい気がする。
シグナルハンドラの中で非推奨のシステム関数は一切呼んで無いし、特別な
処理は一切していないので、よくわからない。
なぜこんな現象が起きるのだ…。
どうやらアプリを終了する直前に Sleep(1000); とかやると、100%落ちない。
ローカル変数の解放(デストラクタ)と、別スレッドが何か衝突しているのか…?
わかった。ローカルクラス変数のオブジェクトがスタックから破棄され
始めているのに、そのローカルクラス内のスレッドが生存して、
自身のメンバ変数にアクセスすることがあるのが原因だった。
規定デストラクタが呼ばれ破棄された後に変数にアクセスしたらたしかに
やばい。グローバル変数の場合は、ファイルを跨いだ初期化は規定されて
ませんが、同一ファイルの初期化(コンストラクタ)は定義順です。
解放については定義順の逆順にデストラクタが呼ばれます。
スタック構造なので最初に(上から) push されたのは後から pop されるってこと
ですね。
当たり前のことなのに全く気にしなかったわ…。
0 コメント:
コメントを投稿