NEW一个对象后,在哪里释放!

qweewqpkn2009 2011-12-03 09:09:57

我是一个树控件,双击上面的一个ITEM的时候,在OnDblclkTree()函数中CTalkDialog *pDlg=new CTalkDialog  NEW了一个对话框变量出来!


代码:


CTalkDialog *pDlg=new CTalkDialog(m_FileORTextSOCK,m_SockAddr);
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);

请问 ,我在哪里释放这个变量呢?   我想当点击关闭按钮后者取消按钮的时候释放,怎么做?   
...全文
465 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyAsk 2012-10-19
  • 打赏
  • 举报
回复
貌似很重要。
gameslq 2011-12-04
  • 打赏
  • 举报
回复
1。用非模态对话框显示信息,建议把pDlg设置成成员变量 m_pDlg
然后分配一次重复利用,最后再删除,因为双击个ITEM可能不止一次
if (!m_pDlg)
{
m_pDlg = new CMyDlg2;
}
m_pDlg->Create(CMyDlg2::IDD,this);

m_pDlg->ShowWindow(SW_SHOWNORMAL);
最后一次释放内存 if ( m_pDlg ) delete m_pDlg;
2.可以PostNcDestroy() 虚函数内进行释放

3.使用模态对话框,更省事
keith_cheung 2011-12-04
  • 打赏
  • 举报
回复
我一般在程序退出时,用

delete pDlg;
战在春秋 2011-12-04
  • 打赏
  • 举报
回复
非模式对话框对象创建于堆内存,为防止内存泄漏,应重写PostNcDestroy虚函数:
void CModeLess::PostNcDestroy() 
{
CDialog::PostNcDestroy();
delete this;
}
qweewqpkn2009 2011-12-04
  • 打赏
  • 举报
回复
综合上面所述 成功解决问题!


感谢各位· 结贴
qweewqpkn2009 2011-12-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 visualeleven 的回复:]

MSDN:
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndD……
[/Quote]

问一下 , enddialog这个函数会不会调用DestoryWindow函数呢?
keith_cheung 2011-12-04
  • 打赏
  • 举报
回复
用类向导生成一个: OnClose

void CDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

if( m_Dlg != NULL )//释放内存
delete m_Dlg;

// AfxMessageBox( _T("Exit!")); 可以加上此句测试一下

CDialogEx::OnClose();
}
Eleven 2011-12-04
  • 打赏
  • 举报
回复
MSDN:
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.

qweewqpkn2009 2011-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jixiang1983 的回复:]

在CTalkDialog中重载PostNcDestroy()释放这个变量,在点击“关闭”按钮退出后就自动调用这个函数void CTalkDialog::PostNcDestroy()
{
delete this;//释放变量
CDialog::PostNcDestroy();
}
[/Quote]

朋友好像我点击关闭的时候并没有调用此函数啊,只有当我点击MFC为我生成的主对话框的时候才会调用CTalkDialog的PostNcDestroy()函数哦!
qweewqpkn2009 2011-12-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dream0411 的回复:]

如果可以的话,你new的这个CTalkDialog作为this的一个成员,比如m_pTalkDlg,需要的时候检查不为空则new并Create,点关闭的时候可以不管它,但this窗口销毁的时候,在this的析构或OnDestroy里删除这个成员m_pTalkDlg;

如果不作为成员的话,你试着在重载CTalkDialog的虚函数PostNcDestroy里加入一句delete this,当……
[/Quote]

我的程序是,用MFC生成对话框程序,在CSOCKETDlg(mfc自己生成的)中的OnDblclkTree()调用的

CTalkDialog *pDlg=new CTalkDialog(m_FileORTextSOCK,m_SockAddr);
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);


我调试了一下,CTalkDialog类的PostNcDestroy()函数没有在我点击CREATE生成的对话框“关闭”时候调用,而是在我点击CSOCKETDlg类的对话框“关闭”按钮的时候才调用了CTalkDialog类的PostNcDestroy()!


如果这样的话,当我create许多的对话框的时候,这样就会有很多资源没有释放,只有当我点击CSOCKETDlg类的对话框“关闭”按钮才能释放这些资源啊· !




(我这个程序有两个对话框,就像QQ一样,一个用户界面,一个聊天窗口!)
qweewqpkn2009 2011-12-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gameslq 的回复:]

1。用非模态对话框显示信息,建议把pDlg设置成成员变量 m_pDlg
然后分配一次重复利用,最后再删除,因为双击个ITEM可能不止一次
if (!m_pDlg)
{
m_pDlg = new CMyDlg2;
}
m_pDlg->Create(CMyDlg2::IDD,this);

m_pDlg->ShowWindow(SW_SHOWNORMAL);
最后一次释放内……
[/Quote]

有句话没看懂,分配一次重复利用? 意思我NEW一次,多次调用CREATE,这样可以吗??? 麻烦解释一下
jixiang1983 2011-12-03
  • 打赏
  • 举报
回复
在CTalkDialog中重载PostNcDestroy()释放这个变量,在点击“关闭”按钮退出后就自动调用这个函数void CTalkDialog::PostNcDestroy()
{
delete this;//释放变量
CDialog::PostNcDestroy();
}
dream0411 2011-12-03
  • 打赏
  • 举报
回复
如果可以的话,你new的这个CTalkDialog作为this的一个成员,比如m_pTalkDlg,需要的时候检查不为空则new并Create,点关闭的时候可以不管它,但this窗口销毁的时候,在this的析构或OnDestroy里删除这个成员m_pTalkDlg;

如果不作为成员的话,你试着在重载CTalkDialog的虚函数PostNcDestroy里加入一句delete this,当窗口关闭后删除自己,就像MFC类CView的做法一样。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧