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

假设我在CDialog的类中有一个公共(public)变量,一个名为“test”的字符串,并且在对话框的OK按钮的onBnClick()事件中,将该“test”变量设置为一个值。然后,我声明对话框的实例,并从主窗口的类中调用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()触发后何时调用析构函数吗?

谢谢,
Blitz

最佳答案

dlg.DoModal()返回时,仅其窗口句柄被销毁。

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

在您的示例中,当dlg返回时,OnEditTest()超出范围。因此,基本上您不必担心,如果您犯了错误,编译器会通知您。

为了进行测试,您可以添加方括号并强制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()被销毁后仍可以访问该指针。但事实并非如此。

关于c++ - 在MFC中,调用EndDialog()时,何时会触发类析构函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31353891/

10-11 22:00
查看更多