在函数内new的,应该在哪个地方delete

cbzjzsb123 2014-02-25 04:44:50
我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢?
void CPrjDlg::OnBtn1()
{
// TODO: Add your control notification handler code here
DlgTest* dlg = new DlgTest;
dlg->Create(IDD_DLG_TEST,this);
dlg->ShowWindow(TRUE);
}
...全文
557 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2014-02-26
  • 打赏
  • 举报
回复
dlg->ShowWindow(TRUE); 这行代码后面释放掉。
worldy 2014-02-26
  • 打赏
  • 举报
回复
引用 楼主 cbzjzsb123 的回复:
我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢? void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here DlgTest* dlg = new DlgTest; dlg->Create(IDD_DLG_TEST,this); dlg->ShowWindow(TRUE); }
可以在destroy函数里,delete this;
wb_rock 2014-02-26
  • 打赏
  • 举报
回复
非要那么麻烦吗?? DlgTest指针定义成CPrjDlg类的成员变量就行了
FrankHB1989 2014-02-26
  • 打赏
  • 举报
回复
没搞清楚生存期的,老老实实用智能指针,不要在应用层代码里出现delete。能make_unique/make_shared就不出现new。 搞清楚的,一般也没兴趣用内建指针了。
cbzjzsb123 2014-02-26
  • 打赏
  • 举报
回复
引用 15 楼 jianwen0529 的回复:
[quote=引用 13 楼 Automation_dmu 的回复:] [quote=引用 10 楼 cbzjzsb123 的回复:] [quote=引用 4 楼 buyong 的回复:] CPrjDlg { ... DlgTest* m_dlg } CPrjDlg::CPrjDlg:m_dlg(NULL) { .... } CPrjDlg::~CPrjDlg { if(m_dlg) { m_dlg->Close(); //?? close the dlg, you may use SendMessage(WM_QUIT) delete m_dlg; m_dlg = NULL; } } void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here m_dlg = new DlgTest; m_dlg->Create(IDD_DLG_TEST,this); m_dlg->ShowWindow(TRUE); }
你这个方法比较好![/quote]倘若这个OnBtn1被多次点击可如何是好?[/quote] 多次点击有什么关系么? 也就是对你创建的对话框进行显示隐藏而已,不需要重新new一个进行显示! 如果内容不同,你进对其内容进行重新设置就可以了[/quote] 我也想到了这个问题,多次点击就多次new,最后只有一个delete。那这样说的,我这样写的方式不合理了,不能点一次new一次,可以点他就显示和影藏就行了。
还差得远呢 2014-02-26
  • 打赏
  • 举报
回复
对话框也是一个类,所以应该在析构函数里释放
Johnblx 2014-02-26
  • 打赏
  • 举报
回复
一般小的设计原则是是谁申请谁释放, 也就是在一个函数内申请,在函数结尾的时候要释放。
引用 楼主 cbzjzsb123 的回复:
我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢? void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here DlgTest* dlg = new DlgTest; dlg->Create(IDD_DLG_TEST,this); dlg->ShowWindow(TRUE); }
幻夢之葉 2014-02-26
  • 打赏
  • 举报
回复
引用 13 楼 Automation_dmu 的回复:
[quote=引用 10 楼 cbzjzsb123 的回复:] [quote=引用 4 楼 buyong 的回复:] CPrjDlg { ... DlgTest* m_dlg } CPrjDlg::CPrjDlg:m_dlg(NULL) { .... } CPrjDlg::~CPrjDlg { if(m_dlg) { m_dlg->Close(); //?? close the dlg, you may use SendMessage(WM_QUIT) delete m_dlg; m_dlg = NULL; } } void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here m_dlg = new DlgTest; m_dlg->Create(IDD_DLG_TEST,this); m_dlg->ShowWindow(TRUE); }
你这个方法比较好![/quote]倘若这个OnBtn1被多次点击可如何是好?[/quote] 多次点击有什么关系么? 也就是对你创建的对话框进行显示隐藏而已,不需要重新new一个进行显示! 如果内容不同,你进对其内容进行重新设置就可以了
幻夢之葉 2014-02-26
  • 打赏
  • 举报
回复
引用 9 楼 cbzjzsb123 的回复:
[quote=引用 3 楼 jianwen0529 的回复:] 不需要用,或者销毁CPrjDlg(析构)的时候 你这是动态创建么? 你这样子的,应该用个成员来保存你的指针,否则你函数退出,局部变量就被销毁了!
为什么不需要用?不会内存泄漏吗?我看以前别人写的代码,也没有delete。[/quote] 不好意思,表达失误! 是不需要的用new出来的东西的时候把它delete掉,或者在你类对象析构的时候delete! 也就是常说的哪里new哪里delete,有时也是相对的说法! new必须delete,否则内存泄露!
AndyStevens 2014-02-26
  • 打赏
  • 举报
回复
引用 10 楼 cbzjzsb123 的回复:
[quote=引用 4 楼 buyong 的回复:] CPrjDlg { ... DlgTest* m_dlg } CPrjDlg::CPrjDlg:m_dlg(NULL) { .... } CPrjDlg::~CPrjDlg { if(m_dlg) { m_dlg->Close(); //?? close the dlg, you may use SendMessage(WM_QUIT) delete m_dlg; m_dlg = NULL; } } void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here m_dlg = new DlgTest; m_dlg->Create(IDD_DLG_TEST,this); m_dlg->ShowWindow(TRUE); }
你这个方法比较好![/quote]倘若这个OnBtn1被多次点击可如何是好?
「已注销」 2014-02-26
  • 打赏
  • 举报
回复
你这个地方原则上是在该函数体最后释放,但是你的意思好像是需要一直使用,你可以将dlg的声明放在外面,然后在dlg生命周期结束的地方释放掉就OK,也可以在DlgTest析构函数中释放。
chinacoding 2014-02-26
  • 打赏
  • 举报
回复
这段代码写的就有问题, 直接CDlg dlg; dlg.showwindow就可以了,根本就不用考虑指针的释放问题。 用new 不是好方法。
赵4老师 2014-02-26
  • 打赏
  • 举报
回复
在家里吃的,应该在哪个地方拉?
cbzjzsb123 2014-02-25
  • 打赏
  • 举报
回复
引用 5 楼 xihu1364 的回复:
[quote=引用 楼主 cbzjzsb123 的回复:] 我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢? void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here DlgTest* dlg = new DlgTest; dlg->Create(IDD_DLG_TEST,this); dlg->ShowWindow(TRUE); }
楼上正解! 加上:你代码使用的非模态对话框,你可以使用模态对话框,domodel后直接delete就好了[/quote] 我这个对话框要嵌在别的对话框里,用不了模态对话框。
cbzjzsb123 2014-02-25
  • 打赏
  • 举报
回复
引用 4 楼 buyong 的回复:
CPrjDlg { ... DlgTest* m_dlg } CPrjDlg::CPrjDlg:m_dlg(NULL) { .... } CPrjDlg::~CPrjDlg { if(m_dlg) { m_dlg->Close(); //?? close the dlg, you may use SendMessage(WM_QUIT) delete m_dlg; m_dlg = NULL; } } void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here m_dlg = new DlgTest; m_dlg->Create(IDD_DLG_TEST,this); m_dlg->ShowWindow(TRUE); }
你这个方法比较好!
cbzjzsb123 2014-02-25
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:
不需要用,或者销毁CPrjDlg(析构)的时候 你这是动态创建么? 你这样子的,应该用个成员来保存你的指针,否则你函数退出,局部变量就被销毁了!
为什么不需要用?不会内存泄漏吗?我看以前别人写的代码,也没有delete。
SKATE11 2014-02-25
  • 打赏
  • 举报
回复
什么地方不需要了就释放
lpcads 2014-02-25
  • 打赏
  • 举报
回复
引用 4 楼 buyong 的回复:
CPrjDlg { ... DlgTest* m_dlg } CPrjDlg::CPrjDlg:m_dlg(NULL) { .... } CPrjDlg::~CPrjDlg { if(m_dlg) { m_dlg->Close(); //?? close the dlg, you may use SendMessage(WM_QUIT) delete m_dlg; m_dlg = NULL; } } void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here m_dlg = new DlgTest; m_dlg->Create(IDD_DLG_TEST,this); m_dlg->ShowWindow(TRUE); }
我在想 m_dlg = NULL; 是否有必要。 因为逻辑上,一个对象已析构后,是不会(不应该)再访问它的成员的。
「已注销」 2014-02-25
  • 打赏
  • 举报
回复
用智能指针
boost::shared_ptr<DlgTest> dlg(new DlgTest());
版主大哥 2014-02-25
  • 打赏
  • 举报
回复
引用 楼主 cbzjzsb123 的回复:
我在一个按钮内,new出了一个对话框,这个delete dlg应该放在什么地方呢? void CPrjDlg::OnBtn1() { // TODO: Add your control notification handler code here DlgTest* dlg = new DlgTest; dlg->Create(IDD_DLG_TEST,this); dlg->ShowWindow(TRUE); }
楼上正解! 加上:你代码使用的非模态对话框,你可以使用模态对话框,domodel后直接delete就好了
加载更多回复(4)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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