C++析构函数的疑问解决方法

C++析构函数的疑问
Classs CGISTestDlg
{
Public:
  CGISTestDlg(CWnd* pParent = NULL);
  ~ CGISTestDlg();
Void OnOK();
Void Release();
Private:
  CGISTestDlg *pgdlg;
}

void CGISTestDlg::OnOK() 
{
// TODO: Add extra validation here
pgdlg = new CGISTestDlg(this) ;
pgdlg->Create(IDD_GISDLGDEMO_DIALOG, this) ; 
}
void CGISTestDlg::Release()
{
  Delete pgdlg;
}
~ CGISTestDlg()
{

}
//在上面的程序中我的析构函数是空的,没有释放什么资源,那么delete pgdlg会把pgdlg释放掉吗?
事实上我的CGISTestDlg类中没有使用堆空间中的内存,我不需要在析构函数中释放什么资源,
那么我该如何删除pgdlg = new CGISTestDlg(this)出来的对象呢?


------解决方案--------------------
Delete pgdlg;
这里已经释放了你申请的资源即可
------解决方案--------------------
你在CGISTestDlg::Release()中已经通过Delete pgdlg;释放了申请的资源,但是你要显式调用Release()这个成员函数,才能释放它。
------解决方案--------------------
new CGISTestDlg(this) ;
需要你调用delete手动删除否则内存泄露
------解决方案--------------------
pgdlg构造函数中,并没有立即被赋值,只有才onOK被调用后,才新建了一个对象,并赋值给pgdlg。 而在Release函数中,通过delete pgdlg来析构pgdlg。

这种做法,并不可取,使用者来说,需要知道前面是否调用过onOK函数,才能确定是否需要调用Release。实际上更简单的做法是在构造函数中pgdlg赋值为null, 析构函数中判断pgdlg是否为null,否则调用delete pgdlg。

另外注意onOK被调用的次数, 是每次都需要新创建对象,还是可以使用同一对象。
------解决方案--------------------
不想 或者 忘了显示调用Release(),最好就是在析构里
~ CGISTestDlg()
{
if( pgdlg )
delete pgdlg;
}

这样就会在程序退出或函数返回时,保证不会出现内存泄漏。