int i=0;
while(i<1000)
{
HANDLE h = CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
i++;
CloseHandle(h);
}DWORD CALLBACK TestThread(LPVOID lpParm)
{
return 0;
}循环启动1000个子线程,内存增加100K以上,请问大虾是怎么回事?是我哪里没有释放吗?

解决方案 »

  1.   

    CSDN中这么多大虾?没人知道吗?
      

  2.   

    如果虚拟内存也有增加,那只能说是系统在内存管理方面设计的不好,在随机分配和释放内存时,自己占用了一些内存(用于管理)没有及时释放。
    你可以这样来验证自己的程序是否有泄露:
    int i=0; 
    while(i <1000) 

        HANDLE h = CreateThread(NULL, 0, TestThread, NULL, 0, NULL); 
        i++; 
        WaitForSingleObject(h, -1); // 在这里等待线程结束,以免造成系统交叉分配和释放内存
        CloseHandle(h); 
      

  3.   

    我按照你的做法做了 还是会占用内存 问题的关键不在我的程序是否有泄露 因为我的子线程没做任何东西 更谈不上泄露了 我的系统是XP 编译环境为Debug Multithreaded DLL
      

  4.   

    我认为是这样的,先看一个调用过程CreateThread 系统要分配空间,创建对应线程内核对象,这都是一个比较耗时的。
    可能你已经跑过了10个循环,你第一个线程还没跑到内核对象清除的地方,不存在泄露。
    建议你看看 一段时间后,占用的内存是否会降下来。
      

  5.   

    关键是长时间运行才能出结果的。int j=0;
    while(j<100){
      int i=0; 
      while(i <1000) 
      { 
        HANDLE h = CreateThread(NULL, 0, TestThread, NULL, 0, NULL); 
        i++; 
        WaitForSingleObject(h, -1); // 在这里等待线程结束,以免造成系统交叉分配和释放内存
        CloseHandle(h); 
      } 
      Sleep(10000);
      j++;
    }
      
    你试试。这样行不。
      

  6.   

    1M?有那么多吗?当年Win98机器共才几M啊......
      

  7.   

    你的win98??我所说的1M是进程里面的虚拟空间。
      

  8.   

    楼主的代码在我的机器上内存没有涨..,一直是672
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>DWORD WINAPI ThreadPro(LPVOID)
    {
    return 0;
    }int main()
    {
    int i;
    HANDLE hTread;
    printf("按任意键继续!!\n");
    getch();
    for (i = 0; i < 1000; i++)
    {
    hTread = CreateThread(NULL, 0, ThreadPro, NULL, 0, NULL);
    WaitForSingleObject(hTread, INFINITE);
    CloseHandle(hTread);
    }
    printf("按任意键继续!!\n");
    getch();
    return EXIT_SUCCESS;
    }
      

  9.   


    你必须进行closehandle(hThread),但是发现每个还是有4k左右内存的损失,可能和主线程有关系