全局变量m_pMainWnd引起内存泄露,求大神分析!!!!!
本帖最后由 zhaoxiatengkong_1 于 2013-08-20 22:54:46 编辑 用MFC做个东西, 但是在 DialogApp中InitInstance()中定义了一个指针pMainFrame 并把它赋给了全局变量m_pMainWnd 但是在ExitInstance()中销毁的时候出现了内存泄露
跟着发现, this->m_pMainWnd = pMainFrame; 这句确实把pMainFrame 赋值给了m_pMainWnd了
查到这两个指针所指向的地址都是 0x0005e3b
然后用完之后我想在ExitInstance()中通过判断m_pMainFrame来销毁pMainFrame这个指针, 但是判断时
m_pMainWnd 指针就已经为空了,所以程序没有进入if程序体 直接跳走了, 导致pMainFrame这个指针没有销毁 从而造成内存泄露, 提示泄露地址就是PMainFrame的地址:0x0005e3b
关键代码如下:
BOOL CDialogApp::InitInstance()
{
CMainFrame* pMainFrame = new CMainFrame();
………………
this->m_pMainWnd = pMainFrame;CWnd* nptr = AfxGetApp()->m_pMainWnd;
…………
return TRUE;
}
int CDialogApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
if(m_pMainWnd){
delete(CMainFrame*)m_pMainWnd;
}
return CWinApp::ExitInstance();
}
不是把pMainWnd 赋值给了m_pMainWnd 了, 但是在ExitInstance中判断时, 怎么m_pMainWnd 就为NULL 了呢? 那pMainWnd指针还没有销毁啊
这个到底是怎么回事呢?
窗口关闭后,m_pMainWnd 这个指针的销毁过程是怎么样的呢?
[解决办法]
你这么担心的话,你可以在CXXApp里定义一个CMainFrame的指针变量来指向这个pMainFrame,然后再自己判断
[解决办法]
应该在DestroyWindow里销毁,就是重载OnDestroyWindow或WM_DESTROYWINDOW(具体忘了,这两个有点区别,你试试一下)