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