当一个窗口关闭时,我的析构函数会被调用吗?

时间:2010-07-23 07:05:12

标签: c++ visual-c++ winapi destructor

如果一个窗口关闭(就像发送WM_CLOSE一样),对象的析构函数是否被调用?

我在这种情况下使用断点检查了我的源代码,但编译器似乎没有通过我的析构函数。

程序是否在没有调用任何析构函数的情况下关闭?

4 个答案:

答案 0 :(得分:2)

通常情况下,不是,除非您的WindowProc这样做。

Window类(例如,CWnd in; AT和FC中的FCindow)是与OS的窗口概念不同的实体(我将其表示为HWND)。它们具有不同的寿命,但它们可以使用WNDPROC“耦合”在一起。

IIRC,MFC将删除CView派生的类,但不会删除大多数CWindow派生的类。此外,ATL的CWindow本身不会被破坏,因为默认情况下它只是一个单向附件(即将CWindow附加到HWND通常不会对窗口进行子类化)。

大多数情况下,调用析构函数是通过另一种机制:

CDialog foo;
foo.DoModal();

当对话框关闭时,将退出声明foo的范围,并将调用foos析构函数。

类似地,关闭主窗口将导致应用程序退出,以此方式撕掉实例。

答案 1 :(得分:0)

我不太清楚我理解,但是假设你有一个典型WndProc的窗口设置,你正在使用类似于:

的消息来传递消息
while (GetMessage(&msg, hwnd, 0, 0) > 0)
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
}

当窗口结束时(处理WM_DESTROY,处理WM_CLOSE帖子并调用DestroyWindow后),此循环将结束,您将继续正常执行。

换句话说,窗口并不是什么特别的东西,但是当它升级时,你几乎停留在这个循环中。你可以像往常一样得到同样的清理工作。

答案 2 :(得分:0)

这取决于Windows关闭后程序的功能。如果它正常退出(通过从main()返回控制) - 那么是,析构函数将被调用,但只有堆栈分配和全局对象。如果它调用TerminateProcess(),它们肯定不会被调用。

答案 3 :(得分:0)

Windows中的对象(窗口,对话框,控件等)与程序中包含它们的C ++对象是分开的,不同的。正在关闭的窗口或对话框不会删除程序中的C ++对象,该对象恰好通过m_Hwnd成员变量与它相关联。

用MFC术语来说,用这种方式想一想 - 如果关闭一个对话框破坏了与之关联的CDialog对象,你怎么能检索与(小d)对话框控件相关的CDialog DDX数据?