接下来的两个片段有什么区别?

时间:2014-01-08 10:55:41

标签: c++ mfc

我是MFC的新手,并提出这两个片段。他们看起来不一样,但两者都有效,我只是不明白为什么? 帮助。非常感谢。

//代码段1

BOOL CMainApp::InitInstance()

{       
  CMainFrame *wnd = new CMainFrame();    
  m_pMainWnd = wnd;     
  wnd->ShowWindow(SW_SHOW);    
  wnd->UpdateWindow();    

  return true;    
}

//代码段2

BOOL CMainApp::InitInstance()

{    
    CMainFrame wnd;
    wnd.ShowWindow(SW_SHOW);
    wnd.UpdateWindow();

    return true;
}

2 个答案:

答案 0 :(得分:0)

对我来说,主要区别在于,在第一种情况下,您为CMainFrame动态分配内存,而在第二种情况下,您似乎将该对象创建为局部变量。

我很惊讶第二种情况没有崩溃,因为 wnd InitInstance 完成执行时被销毁。

在第一个片段中,您将此窗口保留在已分配的内存中,该内容似乎保留在 m_pMainWnd 属性:m_pMainWnd。在leat中,新窗口在InitInstance结束时不会被销毁。

答案 1 :(得分:0)

这只是静态分配的对象和动态分配的对象之间的区别,以及指针的工作方式。

您的第一个代码段动态分配一个新的CMainFrame对象,该对象是默认构造的。它在内存中的地址存储在指针wnd中,然后存储在成员变量m_pMainWnd中。然后,您在ShowWindow指向的对象上调用UpdateWindowwnd

在代码段2中,您静态地为函数本地分配一个CMainFrame对象,然后在该对象上调用ShowWindowUpdateWindow

请注意,虽然存在差异,但在第一个代码段中,CMainFrame对象存在于函数末尾之外;在第二个中,它在函数返回时被销毁。