2011-07-11 8 views
0

2番目の静的ポインタpthisが初期化されない理由が混乱していますか?私がやったことは、静的関数を使ってウィンドウプロシージャをサブクラス化することです。最初の静的ポインタlpProcessは、メインプロシージャで初期化されました。しかし、2番目のものは独自のコンストラクタを呼び出すことさえありません(私はこの問題を特定するためにデバッガを使いました)。どういうわけか、それは単に建設をスキッ​​プします。最初は、私は静的変数のいくつかの点を誤解していたのではないかと疑っています。しかし、最初のものが動作するのを見て、なぜ2番目のものではないのですか?おそらく、これは深い再帰や静的関数の呼び出しと関係があると思いますか?静的ポインタはサブクラス化されたウィンドウプロシージャで初期化されませんか?

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    static QProcessor* lpProcess = new QProcessor(hwnd); //Initialized without any error 

    switch(msg) 
    { 

    case WM_CREATE: 
     { 
      lpProcess->SetFixed(322,200); //Set window size through the container 
      lpProcess->Update(); //Update members 
      if(!lpProcess->CreateChild()) //Create all controls 
      { 
       Error(); //print error 
       ::DestroyWindow(hwnd); //terminate the window 
      } 
      QMonitor::Attach(hwnd); //Attach Monitor Window to current window 

     } 
.... 




void QMonitor::Attach(HWND hwnd) 
{ 
    QMonitor::classdata = (LPVOID)::SetWindowLong(hwnd,GWL_WNDPROC,(LONG)QMainProc); //subclass procedure 
} 




LRESULT CALLBACK QMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    static QMonitor* pthis = new QMonitor(hwnd); //Won't initialize?? 

    switch(msg) 
     { 
     case WM_MOVE: 
      { 
       pthis->OnMove(); 
      } 
      break; 
     case WM_SIZE: 
      { 
       pthis->OnSize(); 
      } 
      break; 
     case WM_COMMAND: 
      break; 
     case WM_DESTROY: 
      delete pthis; 
      break; 
     } 
     return ::CallWindowProc(pthis->GetAttachWndProc(),hwnd,msg,wParam,lParam); 
} 

答えて

1

ほとんどのC++コンパイラは、このような静的データを持つプロシージャに対して、小さなコードの `プリアンブル 'を生成します。このプリアンブルは、(隠された)ブール値フラグをチェックし、それがクリアであれば統計を初期化/構築します。ブーリアンフラグは、スタティックを再度初期化しないことを示すために設定されます。

あなたのコンストラクタは多分このブール値がされ、呼び出されていない場合は、すべてのコンパイラがスレッドセーフな方法でこれらのフラグを管理するため、同じ静を初期化しようとしている複数のスレッドが混乱を引き起こす可能性があります...

ありませんあなたのコードで何か他のものによって壊れていますか?

申し訳ありませんが、問題を直接解決することはできませんが、うまくいけば、デバッガで実行中のアセンブリコードの一部を理解するのに役立ちます。

関連する問題