为什么运行到释放空间就被中断,释放错误?

wensheng_zh2007 2009-07-11 11:01:44
在mfc的一个dialog中

在类的声明中
CButton* p_MyBut[3];


在实现中
p_MyBut[0] = new CButton();
p_MyBut[1] = new CButton();
p_MyBut[2] = new CButton();

在这个dialog的重载OnClose()中


if(p_MyBut[0] != NULL)
{
delete p_MyBut[0];//运行到这个地方就被中断了,难道内存释放错误,请高手指点!
p_MyBut[0] = NULL;
}

if(p_MyBut[1] != NULL)
{
delete p_MyBut[1];
p_MyBut[1] = NULL;
}

if(p_MyBut[2] != NULL)
{
delete p_MyBut[2];
p_MyBut[2] = NULL;
}
...全文
36 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ghost90 2009-07-13
  • 打赏
  • 举报
回复
全部从新编译程序
Rebuild All
wensheng_zh2007 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 gg606 的回复:]
如你所说,我做了一个实验,没问题呀!
[/Quote]
我在另一台机器也试过,也是没有问题!
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
a CMyButton object at $003BF9B0, 84 bytes long
CMyButton类有问题,楼主是不是自定义了一个BUTTON类,中间处理有问题吧
wensheng_zh2007 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pady_pady 的回复:]
你先把你的BUTTON不用,用我的IDYES/IDNO/IDABORT button试试
RECT rect =  { 10,10,50,50};
p_MyBut[0]->Create(L"dd",WS_VISIBLE,rect,this,IDYES);
p_MyBut[0]->ShowWindow(SW_SHOW);
如果用这三个按钮正常,可能问题出在你的BUTTON上了

[/Quote]
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
你先把你的BUTTON不用,用我的IDYES/IDNO/IDABORT button试试
RECT rect = { 10,10,50,50};
p_MyBut[0]->Create(L"dd",WS_VISIBLE,rect,this,IDYES);
p_MyBut[0]->ShowWindow(SW_SHOW);
如果用这三个按钮正常,可能问题出在你的BUTTON上了
wensheng_zh2007 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zgl7903 的回复:]
有可能是CButton的 PostNcDestroy()中已经使用了 delete this操作
if(p_MyBut[0] != NULL)
{
//delete p_MyBut[0];//直接屏蔽试试看如果没有报内存泄漏 就说明已经释放过了
p_MyBut[0] = NULL;
}

[/Quote]
这样在输出中显示如下:
d:\my documents\visual studio 2005\projects\dynamiccreatecontrol\dynamiccreatecontroldlg.cpp(169) : {166} client block at 0x003BFAD0, subtype c0, 84 bytes long.
a CMyButton object at $003BFAD0, 84 bytes long
d:\my documents\visual studio 2005\projects\dynamiccreatecontrol\dynamiccreatecontroldlg.cpp(169) : {165} client block at 0x003BFA40, subtype c0, 84 bytes long.
a CMyButton object at $003BFA40, 84 bytes long
d:\my documents\visual studio 2005\projects\dynamiccreatecontrol\dynamiccreatecontroldlg.cpp(169) : {163} client block at 0x003BF9B0, subtype c0, 84 bytes long.
a CMyButton object at $003BF9B0, 84 bytes long


这不就表示内存泄露了?
gg606 2009-07-12
  • 打赏
  • 举报
回复
如你所说,我做了一个实验,没问题呀!
wensheng_zh2007 2009-07-12
  • 打赏
  • 举报
回复
我定义的类只是继承了CButton,再就是添加了一个响应事件。应该没有问题。

我不用我定义的类,直接用CButton也是不可以
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
试试一个简单的按钮:

RECT rect = { 10,10,50,50};
p_MyBut[0]->Create(L"dd",WS_VISIBLE,rect,this,IDYES);
p_MyBut[0]->ShowWindow(SW_SHOW);
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pady_pady 的回复:]
说错不好意思;
CButton::~CButton()
{
DestroyWindow();
}
你的程序是不是在别的地方自作聪明用了p_MyBut[]->DestroyWindow();?
这样当你delete p_MyBut[0];会再运行DestroyWindow,断言出错的,
[/Quote]

BOOL CWnd::DestroyWindow()
{
CWnd* pWnd;
CHandleMap* pMap;
HWND hWndOrig;
BOOL bResult;

if ((m_hWnd == NULL) && (m_pCtrlSite == NULL))
return FALSE;...
}
它会自动判断窗口的呵呵,可能是你的BUTTON还没有create或者是多次delete了吧
pady_pady 2009-07-12
  • 打赏
  • 举报
回复
CButton::~CButton()
{
DestroyWindow();
}
你的程序是不是在别的地方自作聪明用了p_MyBut[]->DestroyWindow();?
这样当你delete p_MyBut[0];会再运行DestroyWindow,断言出错的,
supconsupcon 2009-07-11
  • 打赏
  • 举报
回复
在析构函数调用delete最保险
dengxuxing 2009-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pady_pady 的回复:]
应该在对话框析构函数中delete

C/C++ code
CxxDlg::~Cxxdlg()
{
for(int i = 0;i<3;++i)
if(p_MyBut[i] != NULL)
delete p_MyBut[i];
}
[/Quote]

同意!
  • 打赏
  • 举报
回复
DestroyWindow();
biweilun 2009-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oyljerry 的回复:]
p_MyBut[0]->DestroyWindow();
[/Quote]
可行。

我觉得你是有些代码没贴出来,这个一般不会有问题的
pady_pady 2009-07-11
  • 打赏
  • 举报
回复
应该在对话框析构函数中delete

CxxDlg::~Cxxdlg()
{
for(int i = 0;i<3;++i)
if(p_MyBut[i] != NULL)
delete p_MyBut[i];
}
oyljerry 2009-07-11
  • 打赏
  • 举报
回复
p_MyBut[0]->DestroyWindow();
zhouzhipen 2009-07-11
  • 打赏
  • 举报
回复
在delete之前可能有正在使用p_MyBut的情况,先DestroyWindow()再删除,试试
zgl7903 2009-07-11
  • 打赏
  • 举报
回复
有可能是CButton的 PostNcDestroy()中已经使用了 delete this操作
if(p_MyBut[0] != NULL)
{
//delete p_MyBut[0];//直接屏蔽试试看如果没有报内存泄漏 就说明已经释放过了
p_MyBut[0] = NULL;
}
supconsupcon 2009-07-11
  • 打赏
  • 举报
回复
p_MyBut是不是被delete多次了???
加载更多回复(1)

16,473

社区成员

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

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

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