这程序泄漏了四个句柄(任务管理器),大伙帮忙找一下吧,我水平有限不晓得还哪里没Close.int main(LPCSTR s)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hRead=NULL,hWrite=NULL;
SECURITY_ATTRIBUTES sa;
DWORD bytesRead=0; sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;

CreatePipe(&hRead,&hWrite,&sa,0);

si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError=hWrite;
si.hStdOutput=hWrite;
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

TCHAR Cmdline[1024]={0},SendBuf[1024]={0}; GetSystemDirectory(Cmdline,sizeof (Cmdline));
strcat(Cmdline,"\\cmd.exe /c dir C:\\");

if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
return 0; CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hWrite);

while (TRUE)
{
if(ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
break;
printf(SendBuf);
Sleep(10);
}

CloseHandle(hRead);
memset(Cmdline,NULL,0);
memset(SendBuf,NULL,0); Sleep(5000); return 0;
}

解决方案 »

  1.   

    在任务管理器里能够查看出来是否泄漏了句柄或内存,默认情况下是无法查看的,需要你在"进程"选项卡中添加句柄、线程,也可以在BoundsChecker等工具里调试.
      

  2.   

    我在代码执行到创建子进程之前才使用掉两个句柄(hRead,hWrite),如果使用CloseHandle分别关闭并返回的话,句柄数并没有泄漏.一旦:CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)
    再分别关闭hRead和hWrite,及进程的两个句柄之后,就泄漏了四个句柄.相信肯定是有泄漏,可我原来不是写C的,近几个月来开始尝试入手C,所以知识面不全,无法找出在什么地方泄漏,还望前人指点一二.
      

  3.   

    版主:fzd999、rivershan、DentistryDoctor、qrlvls   路过的话,帮忙看看吧,多谢了!
      

  4.   

    今天我又拿起这段代码,又想又测试,
    我用一个线程去启动这段代码,等线程返回并且销毁时,一共丢了五个句柄.
    后来又测试用循环执行创建和销毁以上的这段代码,始终只丢这五个句柄,
    并不会因为次数多而增加句柄的丢失.所以得个结论是:
    在Windows上面运行这段代码会丢这几个句柄,在unix上则不会,可能跟Windows服务运行时间长导致系统变慢的原因相类似.
    但我始终想让程序初始完成之后与程序运行完成并释放相应资源之后所占用的系统资源是一样的,
    但由于技术有限却无能为力.
      

  5.   

    原因是这样的,你在创建进程之后,子进程复制了你创建的句柄,你要做好判断,在子进程和父进程中不必要的时候都要close掉
      

  6.   

    经过实际测试,在你CreateProcess成功的时候没有泄露,全部都关闭了,
    但是失败的时候就有泄露了,因为CreatePipe的够本没有关闭
      

  7.   

    saliengu(想吃油条),多谢您的指点, 我在程序中已经做了判断,后来我在读完管道数据之后立刻结束进程,但是还漏洞,您能说得详细一点吗?
      

  8.   

    sunny_szsuj() 多谢了,您讲得非常正确.