2006-07-20 [長年日記]

KillTimerはメッセージキューからWM_TIMERを取り除かない

なので、

std::auto_ptr<X> p;
void foo() {
  p.reset(new X());
  SetTimer(hwnd, id, 0);
}
void bar() {
  KillTimer(hwnd, id);
  p.reset(0);
}
LRESULT windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
  case WM_TIMER:
    // SetTimerしてからKillTimerするまでの間は
    // pは必ず有効なポインタを指しているはず
    p->x();
    break;
  }
}

のようなコードを書くと運が悪いとKillTimerした後でWM_TIMERが来てクラッシュしてしまいます。


トップ «前の日記(2006-07-19) 最新 次の日記(2006-07-21)»