我用链表保存系统中所有的进程,程序可以运行,可是在调试情况下总是发生内存泄露。我把代码贴上,各位帮帮忙,请指出该怎么改,谢谢了!
PROC_PROP为一个结构体。
PROC_PROP *CSysProcHandle::GetProcess()
{
EnablePrivilege(SE_DEBUG_NAME);//提升权限 HANDLE hProcessSnapshot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;
DWORD nModuleCount;
CString str;
PROC_PROP *head = NULL;
PROC_PROP *p1 = NULL;
PROC_PROP *p2 = NULL;

hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if(hProcessSnapshot == INVALID_HANDLE_VALUE)
{
AfxMessageBox("1CreateToolhelp32Snapshot() Error!");
return (PROC_PROP *)0;
}
pe32.dwSize = sizeof(PROCESSENTRY32);

BOOL bRet = Process32First(hProcessSnapshot,&pe32);
if(!bRet)
{
AfxMessageBox("Process32First() Error!");
CloseHandle(hProcessSnapshot);
return (PROC_PROP *)0;
}
if(pe32.th32ProcessID == 0)//第一个进程不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
if(pe32.th32ProcessID == 4)//第二个进程也不需要
{
bRet = Process32Next(hProcessSnapshot,&pe32);
}
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this-〉ProcessNamepe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数

p2 = p1;
p1->pNextProc = NULL;
while(bRet)
{
if(head == NULL)
{
head = p1;
}
else
{
p2->pNextProc = p1;
}
p2 = p1;
p1 = new PROC_PROP
memset(p1,0,sizeof(PROC_PROP));
bRet = Process32Next(hProcessSnapshot,&pe32);
if(!bRet)
{
delete p1;
p1 = NULL;
break;
}
strcpy(p1->procName,pe32.szExeFile); //进程名
str = this->GetProcessPath(pe32.th32ProcessID);
str.TrimLeft("\\?");
strcpy(p1->procPath,str); //进程路径
strcpy(p1->procParent,this->GetProcessName(pe32.th32ParentProcessID)); //父进程名
//strcpy(p1->crcCode,crc.GetFileCode(p1->procPath)); //CRC校验码
p1->dwProcId = pe32.th32ProcessID; //进程ID
p1->pDll = this->GetProcModules(pe32.th32ProcessID,nModuleCount);
p1->dllCount = nModuleCount; //DLL个数
}
p2->pNextProc = NULL;
CloseHandle(hProcessSnapshot);
return head;
}

解决方案 »

  1.   

    其他的没细看,只看到有2处new,一处delete,看看是不是这里的问题
      

  2.   

    不是吧,要是那样的话,我用循环,可是用了很多new的,链表里的delete好像是delete掉最后一个new了但是没有用到的内存的。不知道我说的对不对。
      

  3.   

    至少 第一次 的 new 是肯定泄漏了
      

  4.   

    那怎么解决呢?我需要在哪个地方Delete呢?我看书上创建链表的过程都是这样的,似乎都没有Delete.麻烦大家了。请指出应该在哪个地方修改,谢谢!
      

  5.   

    GetProcess()调用后,delete整张链表
      

  6.   

    p2 = p1;
    p1->pNextProc = NULL;
    while(bRet)
    {
    if(head == NULL)
    {
    head = p1;
    }
    else
    {
    p2->pNextProc = p1;
    }
    p2 = p1;
    p1 = new PROC_PROP
    memset(p1,0,sizeof(PROC_PROP));。你这个链表有问题,导至无法全部释放掉!!!
    这样修改一下就可以了:

    p2 = p1;
    p1->pNextProc = NULL;
    while(bRet)
    {
    if(head == NULL)
    {
    head = p1;
    }p1 = new PROC_PROP
    p2->pNextProc = p1;p2 = p1;
    memset(p1,0,sizeof(PROC_PROP));