過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2011/10/04
R6025 pure virtual function call

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

0 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。