2010-07-23 121 views
1

如果一個窗口關閉(就像發送WM_CLOSE一樣),對象的析構函數是否被調用?當一個窗口關閉時,我的析構函數會被調用嗎?

我在這種情況下跟着我的源代碼中斷點,但編譯器似乎沒有通過我的析構函數。

程序關閉時未調用任何析構函數?

+0

你有一些代碼可以顯示嗎? – 2010-07-23 07:06:36

+0

如果您說的析構函數沒有被調用,您是否看到應用程序的內存佔用量異常,從不減少。 – DumbCoder 2010-07-23 07:20:41

回答

0

我不太清楚我的理解,但讓我們說你有一個窗口的設置具有典型WndProc和你一起類似的東西抽消息:

while (GetMessage(&msg, hwnd, 0, 0) > 0) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

當窗口完成(進程WM_DESTROY,在處理完WM_CLOSE帖子並調用DestroyWindow)後,此循環將結束,並且您將繼續正常執行。

換句話說,這個窗口沒有太特別的地方,但是當它到了時,你幾乎停留在這個循環中。你總是得到相同的清理。

0

這取決於窗口關閉後程序的功能。如果它正常退出(通過返回來自main()的控制) - 那麼是的,析構函數將被調用,但只是堆棧分配和全局對象。如果它叫TerminateProcess()他們絕對不會被叫到。

2

通常情況下,除非你的WindowProc如此。

窗口類(例如,CWnd in; FC和ATL中的CWindow)是與窗口的OS概念(我將表示爲HWND)不同的實體。他們有不同的生活時間,但他們可以使用WNDPROC「耦合」在一起。

IIRC,MFC將刪除CView派生類,但不是大部分CWindow派生的。此外,ATL的CWindow本身不會被銷燬,因爲默認情況下只有單向附件(即,將CWindow附加到HWND通常不會將窗口子類化)。

大多數時候,調用析構函數是另一種機制:

CDialog foo; 
foo.DoModal(); 

當關閉對話框,其中foo聲明範圍將退出,並FOOS析構函數會被調用。

類似地,關閉主窗口會導致應用程序退出,從而導致應用程序在這種情況下停止運行。

0

Windows中的對象(窗口,對話框,控件等)與程序中包裝它們的C++對象是分開的和獨立的。被關閉的窗口或對話框不會刪除程序中的一個C++對象,該對象恰好與m_Hwnd成員變量相關聯。如果關閉一個對話框銷燬與之關聯的CDialog對象,那麼如何檢索與(小d)對話框控件關聯的CDialog DDX數據?

相關問題