第一次用博客,第一篇隨筆,就寫今天遇到的一個問題吧。
在VS2008的MFC對話框程序,窗口成員變量的聲明順序與其析構順序相反,即,先聲明的變量後析構,後聲明的變量先析構。未在其他模式下測試。
class A { public: A() { MessageBox(NULL,"A 構造", "A", MB_OK); } ~A() { MessageBox(NULL,"A 析構", "A", MB_OK);//並不會顯示對話框 } }; class B { public: B() { MessageBox(NULL,"B 構造", "B", MB_OK); } ~B() { MessageBox(NULL,"B 析構", "B", MB_OK);//並不會顯示對話框 } };
然後在對話框類中聲明變量。
A a; B b;
運行程序,會先出現"A 構造"對話框,後出現"B 構造"對話框。
關閉程序,通過調試可以發現,先調用"B 析構"對話框,後調用"A 析構"對話框。但事實上這兩個對話框並不會出現,可能是由於程序退出,MFC阻止了窗口彈出。
重申結論:先聲明的變量後析構,後聲明的變量先析構。
這在A和B有耦合關系的情況下,往往有用。比如,B中使用了A的成員,若A先析構了,而B的線程還未退出,有可能造成溢出,或對話框界面退出而進程未結束等情況。