我正在MFC / c++中创建一个简单的应用程序。此代码是在CWinApp类中建立一个对话框。它可以正常运行并且可以正常运行,但是仅当我从VStudio中运行时才能运行。但是如果我直接运行它,则会发生运行时错误并进行编程坠毁。

CMyDialog dlg;
m_pMainWnd = (CWnd*)&dlg;
dlg.DoModal();

但是如果我使用下面的代码,那么一切都很好。我无法理解这种行为。
CMyDialog *dlg=new CMyDialog();
m_pMainWnd = (CWnd*)dlg;
dlg->DoModal();

这种事情在我过去的其他一些C++(非MFC)项目中也发生过很多次。
请给我指定这个。

最佳答案

在第一种情况下,对象被销毁(当dlg超出范围时),但仍由m_pMainWnd指向。可能/可能由于某种原因导致使用了m_pMainWnd并访问了一个不再存在的对象。

将第一个示例更改为:

CMyDialog dlg;
m_pMainWnd = (CWnd*)&dlg;
dlg.DoModal();
m_pMainWnd = NULL;

如果能够解决问题,则在第二种情况下您不使用它的原因是该对象没有被破坏(尽管由于m_pMainWnd指向该对象,所以在程序关闭时MFC可能会为您破坏它;实际上,这可能是由于在其他情况下是崩溃的原因)。

10-04 14:47