C++静的変数オブジェクトの確立と削除,MFCの運転開始の起点を兼ねて論じる

4604 ワード

C++本をたくさん読んで、静的変数について話しているときは、intメンバーを例に挙げていますね.そうですね.これはよく理解できます.しかし、この静的変数がオブジェクト行であればだめですか?いいだけでなく、時には必要で、しかも穴があいている.
例:
// .h   
class SystemGlobal
{
public:
 static ConfigXML* m_pInstance;
}
// .cpp   
ConfigXML* SystemGlobal::m_pInstance = new ConfigXML();
SystemGlobal::SystemGlobal(void)
{
}

では、いつこのオブジェクトを削除すればいいのでしょうか.長い間考えていて、最初はmain()関数の中にあるはずだと思っていましたが、私はこれがQTプログラムなのか、main()関数の通常のreturn方式を書き換えざるを得ませんでした.
    MainWidget main_widget;
    main_widget.showWidget();

    app.exec();
    delete SystemGlobal::m_pInstance;
    return 1;

試してみましたが、プログラムは正常に終了できます.どうせ5回やっても大丈夫です.普通のC++プログラムはappがありません.execの悩みは、もっと問題ないはずです.
---------------------------------------------------------
それから私はまたネット上で探して(探しにくいです)、この招待状を受けて啓発します:http://bbs.csdn.net/topics/200006181静的変数オブジェクトを持つクラス構造関数から削除するには、次のようにします.
SystemGlobal::~SystemGlobal(void)
{
    delete SystemGlobal::m_pInstance;
}

同じように5回試しても問題ありません.
しかし、この方法はよくないと思います.もしSystemGlobalがプロジェクト全体に複数のインスタンスがあったら、1つのインスタンスを破棄するときは、この静的オブジェクトを破棄しなければなりませんか?この方法は,プロジェクト全体がこのSystemGlobalインスタンスである場合にのみ適している.また,構造関数がリロードやパラメータを許さないと,さらに問題が生じる.
---------------------------------------------------------
最後に、静的変数オブジェクトの初期化は、main()関数が開始される前に実行されるため、実際には非常に重要です.これは何を意味しますか?main()関数を表す最初の文が実行される前に、この静的変数に対応するクラスのコンストラクション関数が実行されていましたが、コンストラクション関数自体は無限の文を実行することができ、main()関数が正の部屋にすぎず、正の部屋が現れる前に、プログラマーはすでに小三日とひっくり返って帰ってきた(古典的なケースだ!)、しかもこの小三はメモリの中に存在し、正房と並んでいる.
おかしくないで、実はMFCの実行プロセスは、CMyApp(CWinAppに継承)のtheAppインスタンスが生成するプロセスから始まる(注意:theAppは静的変数オブジェクトではありませんが、.cppファイルに書かれたグローバルオブジェクトです.静的変数オブジェクトと本質的な違いはありません.theAppオブジェクトのポインタが必要なだけに、静的変数ほど便利ではありません.マイクロソフトはAfxGetApp()グローバル関数を提供しています.しかし、静的変数オブジェクトではなく、なぜこの関数を提供するのでしょうか.私は2つの原因があると思います.1は静的変数の名前が臭いし、長いです.2は関数がより良いパッケージ性を持っているので、より多くの検査をしたり、日を盗んだりすることができます.
MyApp::MyApp()
{ //   2,        
}

MyApp theApp;  //   1,       

BOOL MyApp::InitInstance()
{
}
//   3,    appmodul.cpp  ,   _tWinMain       
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,__in LPTSTR lpCmdLine, int nCmdShow)
{
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

実行すると、MFCソースコードを追跡することで、プログラムがまずブレークポイント1に位置していることがわかり、F 11を押して追跡すると、ブレークポイント2に落ちることがわかります.F 11を押すと、CWinApp::CWinApp(LPCTSTR lpszAppName)が実行され、F 10を押すと、多くの文が実行されて戻ってくることがわかります.確かに別の穴がある.これらのことが終わると、WinMain関数が実行され(ブレークポイント3)、具体的にはWinMain関数がappmodulであることがわかる.cppファイルにあります.読書ノート、2つの効果:1.MFCの初期化が完了すると、WinMainは自動的に呼び出され、両者は相互に関連する.MFCはWinMain関数をカプセル化することも不可能である(さらに述べる必要がある)
参照先:http://www.cnblogs.com/zhili/p/mfcanalyze.htmlhttp://www.moon-soft.com/program/bbs/readelite9623.htm
http://www.cnblogs.com/suncoolcat/p/3367627.html
http://www.xuebuyuan.com/2119787.html(カラーマップ、比較的わかりやすい)
http://cnmqw.iteye.com/blog/1921782(コードが簡略化されていて、非常にはっきりしています)