在MFC中调用EndDialog()时,类析构函数何时触发?

时间:2015-07-11 05:48:52

标签: c++ mfc

在MFC中,对于典型的对话框窗口,当MFC调用OnOK()时,此函数调用EndDialog()函数,并在某种程度上调用类析构函数。

假设我在CDialog的类中有一个公共变量,一个名为" test"的字符串,并且在对话框OK按钮的onBnClick()事件中,我设置了这个& #34;测试"变量为值。然后我声明一个对话框的实例,并从我的主窗口的类中调用DoModal()。我可以从DoModal()返回后设置的变量中读取,没问题。

void Dialog1::OnBnClickedOk()
{
    test = "The test string has been set.";
    OnOK();
}

void CMainFrame::OnEditTest()
{
    Dialog1 dlg;
    dlg.DoModal();
    MessageBox(dlg.test, L"Main Frm",0);
}

这样可行,但如果我有一个包含多个字段的对话框,并且每个字段都有一个变量,那该怎么办呢?在调用析构函数之前,如何确保可以读取所有变量中的所有值?我检查了MSDN,我的理解是OnOK()函数调用EndDialog(),并且在某些时候,在EndDialog()之后,调用类析构函数。我希望始终能够从OnBnClick()事件中设置的变量中读取值,但我不确切知道MFC何时调用类析构函数。有没有人知道EndDialog()触发后何时调用析构函数?

谢谢, 闪击

1 个答案:

答案 0 :(得分:2)

dlg.DoModal()返回时,只会破坏其窗口句柄。

dlg超出范围时,稍后会调用析构函数。这部分与任何C++类相同。

在您的示例中,dlgOnEditTest()返回时超出范围。所以基本上你不必担心,如果你犯了错误,编译器会告诉你。

对于测试,您可以添加括号并强制dlg更快地超出范围:

void CMainFrame::OnEditTest()
{
    {
        Dialog1 dlg;
        dlg.DoModal();
        MessageBox(dlg.test, L"Main Frm",0);
    }
    //dlg goes out of scope here and ~dlg() is called

    //Next line will obviously not compile:
    MessageBox(dlg.test, L"Main Frm",0); 
}

作为旁注,如果您已将dlg声明为指针,则必须更加小心。因为您必须手动delete指针,并且在dlg()被销毁后仍然可以访问指针。但情况并非如此。