在 MFC 中,当调用 EndDialog() 时,class 析构函数何时触发?
In MFC When EndDialog() is called, when does class destructor fire?
在MFC中,对于典型的对话框window,当MFC调用OnOK()时,这个函数调用了EndDialog()函数,不知何故在某个时候调用了class析构函数.
假设我有一个 public 变量,一个名为 "test" 的字符串,在 CDialog 的 class 中,在对话框确定按钮的 onBnClick() 事件中,我设置这个 "test"变量为一个值。然后我声明一个对话框的实例,并从我的主 window 的 class 调用 DoModal()。我可以从设置一次的变量中读取 DoModal() returns,没问题。
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()之后,调用了class析构函数。我希望始终能够从 OnBnClick() 事件设置的变量中读取值,但我不知道 MFC 何时调用 class 析构函数。有谁知道 EndDialog() 触发后何时调用析构函数?
谢谢,
闪电战
当dlg.DoModal()
returns时,只有它的window句柄被销毁。
当 dlg
超出范围时,稍后调用析构函数。这部分与任何 C++
class.
相同
在您的示例中,dlg
在 OnEditTest()
returns 时超出范围。所以基本上你不必担心,如果你犯了错误,编译器会告诉你。
为了测试,您可以添加括号并强制 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()
销毁后指针仍然可以访问。但这里不是这样。
在MFC中,对于典型的对话框window,当MFC调用OnOK()时,这个函数调用了EndDialog()函数,不知何故在某个时候调用了class析构函数.
假设我有一个 public 变量,一个名为 "test" 的字符串,在 CDialog 的 class 中,在对话框确定按钮的 onBnClick() 事件中,我设置这个 "test"变量为一个值。然后我声明一个对话框的实例,并从我的主 window 的 class 调用 DoModal()。我可以从设置一次的变量中读取 DoModal() returns,没问题。
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()之后,调用了class析构函数。我希望始终能够从 OnBnClick() 事件设置的变量中读取值,但我不知道 MFC 何时调用 class 析构函数。有谁知道 EndDialog() 触发后何时调用析构函数?
谢谢, 闪电战
当dlg.DoModal()
returns时,只有它的window句柄被销毁。
当 dlg
超出范围时,稍后调用析构函数。这部分与任何 C++
class.
在您的示例中,dlg
在 OnEditTest()
returns 时超出范围。所以基本上你不必担心,如果你犯了错误,编译器会告诉你。
为了测试,您可以添加括号并强制 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()
销毁后指针仍然可以访问。但这里不是这样。