我知道DestroyWindow函数可以把窗口清除,然后自动调用WM_DESTROY消息,从而调用PostQuitMessage,送出MW_QUIT信息,这样的话就会结束信息循环,就会结束整个的应用程序。我的问题是:
前面已经用new来开辟了一个关于对话框的对象空间
CMyDlg *pDlg=new CMyDlg; 如果我已经用 DestroyWindow来消除了一个对话框,还有必要用delete函数来释放内存的空间么?
是不是结束了整个的应用程序,就会自动的释放已经申请的内存空间?清高手答复,谢谢
前面已经用new来开辟了一个关于对话框的对象空间
CMyDlg *pDlg=new CMyDlg; 如果我已经用 DestroyWindow来消除了一个对话框,还有必要用delete函数来释放内存的空间么?
是不是结束了整个的应用程序,就会自动的释放已经申请的内存空间?清高手答复,谢谢
同意该说法!!!
delete pDlg;不调用的话内存不会释放,而且析构函数只会在调用delete之后才会调用
1,建立一个基干对话框的程序.
2,在CAboutDlg内加一个变量char * p,在构造函数中new 10M,在析构函数中delete.
3,在主对话框中加三个按钮.
按钮一: new CAboutdlg.
按钮二: DestroyWindow
按钮三: delete
{
p = new char[10000000];
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}CAboutDlg::~CAboutDlg()
{
delete [] p;
} CAboutDlg * pAboutDlg = NULL;
void CDestroydlgDlg::OnButton1()
{
if(NULL == pAboutDlg)
pAboutDlg = new CAboutDlg;
}void CDestroydlgDlg::OnButton2()
{
if(NULL != pAboutDlg)
{
pAboutDlg->DestroyWindow();
pAboutDlg = NULL ;
}
}void CDestroydlgDlg::OnButton3()
{
if(NULL != pAboutDlg)
{
delete [] pAboutDlg;
pAboutDlg = NULL ;
}
}我的结果是必须delete
void CDestroydlgDlg::OnButton4()
{
for(int i = 0 ; i < 100000 ; i++)
{
CDialog * pDlg = new CDialog(IDD_ABOUTBOX);
pDlg->DestroyWindow();
//delete pDlg;
}
}
//更简单的方法
//f5进入调试状态,在程序结束时vc会报内存泄露的
//显示在output
class CTestDialog : public CDialog
{
public:
~CTestDialog()
{
MessageBox( "~CTestDialog()" );
}
...
}
创建对话框
CTestDialog *pDlg = new CTestDialog();
pDlg->Create( IDD_DIALOG1, this );
销毁对话框
pDlg->DestroyWindow();
看见了吗?会弹出一个对话框,就是析构函数里的那个对话框
这就证明了调用DestroyWindow时会析构该对象。那么在这之后pDlg不就是空的了吗?
但是如果再delete pDlg并不会出错,那不是说pDlg还是指向某一片内存的吗?
我也糊涂了,请大家说说吧,我的结论就是还要delete的
delete pDlg时弹出消息框了,
所以说delete是必须的
{
if (m_hWnd == NULL)
return FALSE; CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);
CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
#ifdef _DEBUG
HWND hWndOrig = m_hWnd;
#endif#ifdef _AFX_NO_OCC_SUPPORT
BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd);
else
bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT // Note that 'this' may have been deleted at this point,
// (but only if pWnd != NULL)
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);
#endif
}
else
{
#ifdef _DEBUG
ASSERT(m_hWnd == hWndOrig);
#endif
// Detach after DestroyWindow called just in case
Detach();
}
return bResult;
}看看这个DestroyWindow里哪句话会delete this ?
记住一点, 如果他是 new 出来的, 那么肯定有一个地方 delete 它, 否则都会有内存泄漏.
如果一个窗口反复开几百次不就死定了