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

C++ 在MFC中,当调用EndDialog()时,类析构函数何时触发?,c++,mfc,C++,Mfc,在MFC中,对于典型的对话框窗口,当MFC调用OnOK()时,该函数调用EndDialog()函数,并且在某个点调用类析构函数 假设我在CDialog的类中有一个公共变量,一个名为“test”的字符串,在对话框OK button的onBnClick()事件中,我将这个“test”变量设置为一个值。然后声明对话框的一个实例,并从主窗口的类中调用DoModal()。我可以读取DoModal()返回时设置的变量,没有问题 void Dialog1::OnBnClickedOk() { test

在MFC中,对于典型的对话框窗口,当MFC调用OnOK()时,该函数调用EndDialog()函数,并且在某个点调用类析构函数

假设我在CDialog的类中有一个公共变量,一个名为“test”的字符串,在对话框OK button的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++
类相同

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

对于测试,您可以添加括号并强制
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
声明为指针,则必须更加小心。因为您必须手动
删除
指针,并且在
dlg()
被销毁后指针仍然可以访问。但这里不是这样。

在上述代码中,
dlg
将保持有效,直到
OnEditTest()
返回。因此,您有足够的时间读取任意多的值。您是否恰好知道何时调用析构函数?从堆栈中删除dlg时是否调用它?在MSDN中找不到这个信息。<代码> diaLu1是一个常规C++类,C++生存期规则适用。MSDN不记录标准C++。谢谢。在C++中我还有很多要学习的。使用间谍+ +,你会知道事件的确切顺序。我不知道简单地将代码封装在括号中会使它超出这样的范围,谢谢。所以EndDialog在关闭时调用c对话框窗口。根据MSDN:“EndDialog不会立即关闭对话框。相反,它会设置一个标志,指示对话框在当前消息处理程序返回时立即关闭。”在我的示例中,是“当前消息处理程序”,即拥有名为DoModal?的方法的执行线程@Blitz:Curly braces。这是基本的C++(和C)。谢谢有关块范围的链接。我是C++新手。我假设 EntAlgule只在对话框被销毁后返回。如果不是这样的话,文件会清楚地表明这一点
DoModal
在对话框被销毁后返回。