CFrameWnd* p = new CFrameWnd;……,代码内详。当DestroyWindow,然后delete p就出错。

ttnewday 2009-03-26 05:34:57
CFrameWnd* p = new CFrameWnd;
p->Create(NULL, NULL, WS_OVERLAPPEDWINDOW, CRect(0,0,0,0), this);
p->DestroyWindow();
delete p;
p = NULL;

当DestroyWindow,然后delete p就出错。

错误信息为:
"xxxx"指令引用的"0x0000004"内存。该内存不能为"read"。

如果p->DestroyWindow()和delete p去调任何一个,就没问题。但这样,DestroyWindow后,不delete p,会不会导致内存泄漏?或者,只delete p,而不DestroyWindow,window的资源会不会释放?
...全文
163 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
同意5楼的
ttnewday 2009-03-26
  • 打赏
  • 举报
回复
太感谢大家了。
wzaen 2009-03-26
  • 打赏
  • 举报
回复
楼上的,不调用DestroyWindow窗口的wm_destroy消息是收不到的,更有可能有资源没释放
调用DestroyWindow窗口就删除自己,不会有内存泄漏

楼主,你的代码可以改成如下:


CFrameWnd* p = new CFrameWnd;
ASSERT(p != NULL);
if (p->Create(NULL, NULL, WS_OVERLAPPEDWINDOW, CRect(0,0,0,0), this))
{
p->DestroyWindow();//内部会去delete
}
else
{
delete p;//窗口没创建需要delete
}
p = NULL;//赋值为空,避免野指针

hust_terry 2009-03-26
  • 打赏
  • 举报
回复
用delete就行了,不要用DestroyWindow,DestroyWindow会释放窗口句柄,这时P所指向的是一个非法对象,而不delete p又会有资源泄露。去掉p->DestroyWindow();就行。
wzaen 2009-03-26
  • 打赏
  • 举报
回复

void CFrameWnd::PostNcDestroy()
{
// default for frame windows is to allocate them on the heap
// the default post-cleanup is to 'delete this'.
// never explicitly call 'delete' on a CFrameWnd, use DestroyWindow instead
delete this;
}
wzaen 2009-03-26
  • 打赏
  • 举报
回复
这是mfc为自己方便设计的,却往往成了大家的陷阱。。。
wzaen 2009-03-26
  • 打赏
  • 举报
回复
直接DestroyWindow就行了,不用delete,在收到相应消息的时候CFrameWnd调用delete this;已经自删除了。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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