下面的程序用F5运行时,被告知有内存泄漏,我不清楚在哪?
void CMemoryLackDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
WriteErrorTrace("Hello","Program begins running ......");

}void CMemoryLackDlg::WriteErrorTrace(CString InfoTitle,CString Info)
{
char buf1[48],buf2[256];
    FILE *fp;    memset(buf1,0x00,sizeof(buf1));
    memset(buf2,0x00,sizeof(buf2));
strcpy(buf1,InfoTitle.GetBuffer(InfoTitle.GetLength()));
    strcpy(buf2,Info.GetBuffer(Info.GetLength()));
InfoTitle.ReleaseBuffer();
Info.ReleaseBuffer(); char WorkPathName[80],WorkPathValue[1024],tmpFileName[1024];
memset(WorkPathName,0x00,sizeof(WorkPathName));
memset(WorkPathValue,0x00,sizeof(WorkPathValue));
memset(tmpFileName,0x00,sizeof(tmpFileName)); strcpy(WorkPathName,"ProgramPath");
::GetEnvironmentVariable(WorkPathName,WorkPathValue,sizeof(WorkPathValue));
strcpy(tmpFileName,WorkPathValue);
strcat(tmpFileName,"\\tmp\\ErrorTrace.txt");
    if((fp = fopen(tmpFileName,"a+")) == NULL)
    {
return;
    }
    else
    {
fprintf(fp,"\n%s: %s\n",buf1,buf2);
        fclose(fp);
    } //2003.4.24 Check Memory Leak
int MemoFlag = _CrtDumpMemoryLeaks();
if(MemoFlag == 1)
AfxMessageBox("WriteErrorTrace");
}就算我在OnButton1()方法中不调用WriteErrorTrace()方法,如下
void CMemoryLackDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
//WriteErrorTrace("ZJOP.exe","Program begins running ......");

int MemoFlag = _CrtDumpMemoryLeaks();
if(MemoFlag == 1)
AfxMessageBox("WriteErrorTrace");

}
运行F5还是告诉我有内存泄漏,大家帮忙指点一下吧。

解决方案 »

  1.   

    _CrtDumpMemoryLeaks();
    这个命令应在整个程序结束前再调用。你的对话框还没结束呢就检查内存,一定会有误报的。
      

  2.   

    新建一个工程,基于对话框在OnInitDlg()中添加int MemoFlag = _CrtDumpMemoryLeaks();
    if(MemoFlag == 1)
    AfxMessageBox("WriteErrorTrace");运行同样运行AfxMessageBox,可见vc自身就有泄露
      

  3.   

    不是VC自身就有泄露,而是检查早了。
    _CrtDumpMemoryLeaks()的功能就是检查当前内存中所有分配但未删除的内存块。 此时对话框还没有析构,其分配的内存也没有删除,所以会报告。应在所有分配内存全删除后再用此函数。
      

  4.   

    所有内存释放的时候是在哪里
    _CrtDumpMemoryLeaks()因该写在什么地方?
      

  5.   

    我知道了,只要在代码中加入_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF  | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));,在程序任何退出的地方都会把内存泄漏的情况按你的指定方式显示出来.