下面的程序用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还是告诉我有内存泄漏,大家帮忙指点一下吧。
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还是告诉我有内存泄漏,大家帮忙指点一下吧。
这个命令应在整个程序结束前再调用。你的对话框还没结束呢就检查内存,一定会有误报的。
if(MemoFlag == 1)
AfxMessageBox("WriteErrorTrace");运行同样运行AfxMessageBox,可见vc自身就有泄露
_CrtDumpMemoryLeaks()的功能就是检查当前内存中所有分配但未删除的内存块。 此时对话框还没有析构,其分配的内存也没有删除,所以会报告。应在所有分配内存全删除后再用此函数。
_CrtDumpMemoryLeaks()因该写在什么地方?