BOOL CAPPBlockApp::InitInstance()
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
EnableTaskbarInteraction(FALSE);
SetRegistryKey(_T("應用程式向導生成的本地應用程式"));
CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
問題出在CMainFrame* pFrame = new CMainFrame;這一句,最后程式退出的時候提示記憶體泄露,報錯指向的是這一句。
但是我已經在CMainFrame類的PostNcDestroy中添加了delete this,并且這一句有執行。
void CMainFrame::PostNcDestroy()
{
delete this;
}
請問各位大牛,為何還是會報錯記憶體泄露?謝謝指點
uj5u.com熱心網友回復:
pFrame = new CMainFrame; 是 構造一個 與 原 CMainFrame (即 pFrame->LoadFrame(IDR_MAINFRAME,)無關的 Frameuj5u.com熱心網友回復:
構造了兩次MainWnd,洗掉了一個,還有一個uj5u.com熱心網友回復:
MFC框架在視窗Destroy之后默認會呼叫CFrameWnd::PostNcDestroy() 函式,該函式中會呼叫delete this;來洗掉指標,你可以不必多載該虛函式。如果你的框架類指標不是通過new的方式分配的話,比如定義沒某一個類的成員函式的話,那么你需要多載這個虛函式來修改其實作,再呼叫delete this肯定會導致程式例外。
uj5u.com熱心網友回復:
但是這個是VS2010創建工程的時候自動生成的我, 我沒有修改過。請問你的意思是不需要new MainFrame,直接用pFrame->LoadFrame嗎?
uj5u.com熱心網友回復:
你好,我還是不太明白,只有一個地方new MainFrame啊,難道CWinAPP在創建的時候默認就new了一個?
uj5u.com熱心網友回復:
我的意思是創建的默認的工程應該沒有記憶體泄漏的問題,App類中InitInstance中new的,PostNcDestroy中會幫你呼叫delete this;
uj5u.com熱心網友回復:
pFrame = new CMainFrame; 是 構造一個 與 原 CMainFrame (即 pFrame->LoadFrame(IDR_MAINFRAME,)無關的 Frame
但是這個是VS2010創建工程的時候自動生成的我, 我沒有修改過。請問你的意思是不需要new MainFrame,直接用pFrame->LoadFrame嗎?
我的意思是創建的默認的工程應該沒有記憶體泄漏的問題,App類中InitInstance中new的,PostNcDestroy中會幫你呼叫delete this;
恩恩,一開始我沒有多載PostNcDestroy的,但是系統報了記憶體泄露。所以我還是不是很明白2 3樓說的,new了兩次MainFrame是什么意思,能不能再說一下到底是哪里new了兩次?
uj5u.com熱心網友回復:
1 "new了兩次MainFrame"說法 不對 因為 LoadFrame 回傳 BOOL通常 使用new 的 方法 是
// To create the main window, this code creates a new frame window
// object and then sets it as the application's main window object.
CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame;
// create and load the frame with its resources
pFrame->LoadFrame(
IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
NULL,
NULL
);
2 CWinApp::InitInstance(); 是個 虛 函式 ,即 CAPPBlockApp::InitInstance()
是 他的多載 , 不必再 呼叫 CWinApp::InitInstance(); 去掉 試試 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/38808.html
標籤:界面
