用户名: 密码: 忘记密码? 注册
收藏此问题 发表新评论

[内存问题]VC中Client Block at的问题...路过的都进来看看吧

一个基于对话框的MFC程序...
在程序退出的时候 出现内存泄露 具体信息如下:

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp(4500) : {405} client block at 0x005DE4E8, subtype c0, 56 bytes long.
a CObject object at $005DE4E8, 56 bytes long
Object dump complete.

找到wincore.cpp的4500行(红色代码), 具体代码如下:
BOOL CWnd::ExecuteDlgInit(LPVOID lpResource)
{
// Subclass Feature Pack controls: 
if (m_pMFCCtrlContainer == NULL)
{
m_pMFCCtrlContainer = new CMFCControlContainer (this);
m_pMFCCtrlContainer->SubclassDlgControls ();
}
  ...
  ...
  ...

}

问题是出在那个new的地方?
具体该怎么在我自己的代码中检测呢?
我用的是VS2010... 希望各位帮忙出出主意啊

昵称: hello_stranger  时间: 2011-01-12 09:52:03
1、m_pMFCCtrlContainer 没有delete
2、vs编译时没有办法检测,只有运行后会提示泄露
昵称: varding  时间: 2011-01-12 09:58:00
同意1楼的说法,new完就要记得delete
昵称: fqzlala  时间: 2011-01-12 10:01:34
引用 1 楼 varding 的回复:

1、m_pMFCCtrlContainer 没有delete
2、vs编译时没有办法检测,只有运行后会提示泄露

问题是wincore.cpp是MFC内部的代码 不是我自己写的
如何检测到是哪个对话框初始化的时候 调用了ExecuteDlgInit函数?
{405} client block at 0x005DE4E8
{}内的405是内存分配序号么? 如何定位呢?
有时候{}内是403 
这个纠结啊
昵称: hello_stranger  时间: 2011-01-12 10:30:59
_CrtSetBreakAlloc(405),MFC内部应该也是调用了crt的内存分配
昵称: lostying  时间: 2011-01-12 10:37:25
可能是对话框没有正常释放,你的对话框应该是new出来的,对吗?
昵称: eyey1  时间: 2011-01-12 11:01:12
405是内存块编号,这个应该是变的,看你申请内存的顺序了

你是不是窗口没有正确的关闭?
昵称: varding  时间: 2011-01-12 11:05:02
引用 4 楼 lostying 的回复:

_CrtSetBreakAlloc(405),MFC内部应该也是调用了crt的内存分配

watch里面添加上面的CRT调试代码 找不到...
昵称: hello_stranger  时间: 2011-01-12 11:21:16
引用 5 楼 eyey1 的回复:

可能是对话框没有正常释放,你的对话框应该是new出来的,对吗?

我的对话框 都是自己定义 然后DoModal出来的
昵称: hello_stranger  时间: 2011-01-12 11:22:42
引用 6 楼 varding 的回复:

405是内存块编号,这个应该是变的,看你申请内存的顺序了

你是不是窗口没有正确的关闭?

程序的主界面中响应WM_CLOSE消息的代码 我都是发送WM_CLOSE消息结束的
void CCageDlg::OnClose()
{
// CreateSession dialog
if ( m_pDlgNewSession )
{
m_pDlgNewSession->SendMessage( WM_CLOSE, 0, 0);

if ( m_pDlgNewSession->m_pPickProxyDlg )
{
m_pDlgNewSession->m_pPickProxyDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( m_pDlgNewSession->m_pPickPlayerDlg )
{
m_pDlgNewSession->m_pPickPlayerDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( m_pDlgNewSession->m_pConfirmDlg )
{
m_pDlgNewSession->m_pConfirmDlg->SendMessage( WM_CLOSE, 0, 0);
}
}

// Pending page
if ( GetPendingPage().m_pPlayerInfoDlg )
{
GetPendingPage().m_pPlayerInfoDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( GetPendingPage().m_pPickProxyDlg )
{
GetPendingPage().m_pPickProxyDlg->SendMessage( WM_CLOSE, 0, 0);
}

// Buy-In page
if ( GetBuyInPage().m_pBuyInDlg )
{
GetBuyInPage().m_pBuyInDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( GetBuyInPage().m_pPlayerInfoDlg )
{
GetBuyInPage().m_pPlayerInfoDlg->SendMessage( WM_CLOSE, 0, 0);
}

// Active page
if ( GetActivePage().m_pPlayerInfoDlg )
{
GetActivePage().m_pPlayerInfoDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( GetActivePage().m_pSessionInfoDlg )
{
GetActivePage().m_pSessionInfoDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( GetActivePage().m_pAddBuyInDlg )
{
GetActivePage().m_pAddBuyInDlg->SendMessage( WM_CLOSE, 0, 0);
}

if ( GetActivePage().m_pBuyOutDlg )
{
GetActivePage().m_pBuyOutDlg->SendMessage( WM_CLOSE, 0, 0);
}

CDialogEx::OnClose();
}
昵称: hello_stranger  时间: 2011-01-12 11:24:57
引用 7 楼 hello_stranger 的回复:

引用 4 楼 lostying 的回复:

_CrtSetBreakAlloc(405),MFC内部应该也是调用了crt的内存分配

watch里面添加上面的CRT调试代码 找不到...

那段是加在程序里面的代码,最好在WinMain里面就调用,MFC就在initInstance里面.
如果是在watch窗口的话,应该是{,,msvcr90d.dll}_crtBreakAlloc,其中msvcr90d.dll替换成你的程序加载的crt动态库,直接设置这个变量的值就行了.断电的话你可以在mfc的源码appinit.cpp里面的AfxWinInit的开始处设置一个,或者直接到ctrexe.c里面直接设到mainCRTStartup处.
昵称: lostying  时间: 2011-01-12 11:56:02
VS2010的mfc,我退出就 ,报错

Detected memory leaks!
  Dumping objects->
    f:\dd\vctools\vc71ibs\ship\atlmfc\src\mfc\thrdcore.cpp(306):{799}client block at 0x005B87E0,subtype c0,68 bytes long a CWinThread object at $005B87E0,68,bytes long  Object dump complete
昵称: Yearss  时间: 2018-06-27 16:46:43
我明明f盘里没有这个文件夹的啊,所以总是说系统找不到指定文件,这个怎么一回事啊?求教啊大佬们
昵称: Yearss  时间: 2018-06-27 16:48:57
上面的问题,哪位前辈、同仁可以指点迷津啊?
昵称: 余味  时间: 2018-06-27 16:53:47
struct  Point
{
long a;
long b;
long c;
short inx;
long l_time;

};

bool m_EndThread;

Point  Pointspace[1000];
short p_inx;
//------------------------------

void xxDlg::OnButtonSave()//按保存按钮
{



CString str1,str2,str3;

GetDlgItem(IDC_EDIT1)->GetWindowText(str1)

long a=atoi(str1)

long b=*****************
long c=**************

long t0=10;

Pointspace[p_inx].a = a;

Pointspace[p_inx].b = b;
Pointspace[p_inx].c = c;
Pointspace[p_inx].l_time = t0;



CString n,n1,n2,n3;
CFile file2(d:\\3.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
n1.Format("%f",Pointspace[p_inx].a);

n2.Format("%f",Pointspace[p_inx].b);

n3.Format("%f",Pointspace[p_inx].c);

n=n1+""+n2+""+n3+""+"\r\n";

file2.Write(n,n.GetLength());
file2.Close;
p_inx++;

afxDump<<p_inx<<"=p_inx\n";

}

UNIT         timmef1(LPVOID aparm)
{

double  rfos;
while(1)
{
MationStart();

afxDump<<rfos_x<<"=rfos\n";
}

return 0;

}





MationStart()
{

long tm_a,tm_b,tm_c;
for(short i=(p_inx-1);i<p_inx; i++)
  {  
if(i==0)
    {

     Denmic( (long)Jspace[i].a ,(long)Jspace[i].b,(long)Jspace[i].c,(long)Jspace[i].l_time);
     }
   else
    {
     tm_a=(long)Jspace[i].a-(long)Jspace[i- 1].a;
      tm_b=(long)Jspace[i].a-(long)Jspace[i- 1].b;
      tm_c=(long)Jspace[i].a-(long)Jspace[i- 1].c;

      Denmic(tm_a,tm_b,tm_c,(long)Jspace[i].c,(long)Jspace[i].l_time);
     }

  }

}
  
//=========================================
Denmic(long a,long b,long c,long t0)
{

long count =0;

double os[3];tim=0,t0;
double rfos_x,rfos_y,rfos_z;
short space_x,space_y,space_z;

while(1)
{

  if (space_x>0&&space_y>0&&space_z>0)
  {
      if(time<t0)
       {
        T+=6;

     os[0]=a*T*T/(t0*t0);
     os[1]=b*T*T/(t0*t0);
     os[2]=c*T*T/(t0*t0);

         for(short i=1;i<=3;i++)
            {
              te(i,os[3-i]);

             }

         }

       if(time==t0)

       {
         Stop(a,tf);
         Stop(b,tf);
        Stop(c,tf);
       }
   }

    else if ((space_x==0)&&(space_y==0)&&(space_z==0))
   
     {
      Start(x);
      Start(y);
      Start(z);
     }
      count++;

}



}
//================================================

void xxDlg::OnButtonStart()//启动按钮

{
AfxBeginThread(timef1,this);

}

我读取rfos_x的值为什么只是最后倒数的2个点位的差值啊,我想要所有点位,相连差值的累加的和啊!
哪里要修改啊
昵称: 余味  时间: 2018-06-27 20:03:53
发表评论
昵称:
内容:
验证: