句柄数不停增加

原来的程序:
CSocket sock         //开始
循环开始             //不出意外应该能够执行1500次左右然后挂掉
sock.create(....     //中间我好象还不止一次这么操作的
循环结束
sock.close()         //这里结束
  
现在的程序:

循环开始            //开始
CSocket sock
sock.create(....    
sock.close          //在一切可能退出的地方都close一下
循环结束            //结束

 

 

到底是什么原因使一个进程的句柄数不断增加,为什么句柄数增加到一定数目就会当呢?

句柄有很多种(HDC,HPEN,HANDLE,HINSTANCE.....)
它代表windows中的一种资源,比如你在重绘中用了HDC而使用完忘记释放它那么就可能出现句柄数一直增加的情况。

其实,句柄就是一个数字,系统可以把它转换成指向某种资源的指针 ,普通程序一般无法做到。也就是说,你可以通过它来分配操作   释放系统资源。而不必关心系统是怎么管理的。句柄数增加的情况   可能是资源泄露吧,不断的申请某种资源,但没有释放操作,最后   系统为这个进程分配的资源被耗近,为了不让整个系统崩溃,就把这个进程杀掉了,大概是这样了,具体泄露的是什么,。要看程序才能知道~~~~~ 。


Windows句柄数的限制问题,最近发现以前写的部分程序存在句柄数不断增加,系统运行一段时间后就会出现问题

检查发现这是由于创建线程完成以后没有调用CloseHandle,导致句柄数量不断增加,而操作系统对句柄最大数量是有限制的,经测试,在Windows XP SP3 下大概只能开到34万个,之后开任何程序都可能被报错。

经过代码检测,发现在常用的Read和Write操作中没有释放句柄导致此问题,代码如下所示:

    OVERLAPPED m_osWrite;
    memset(&m_osWrite,0,sizeof(OVERLAPPED));
    m_osWrite.Internal = 0;
    m_osWrite.InternalHigh = 0;
    m_osWrite.Offset = 0;
    m_osWrite.OffsetHigh = 0;
    m_osWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);    

此处在WriteFile的时候,使用了CreateEvent一个HANDLE,但是没有使用CloseHandle释放句柄,所示导致此问题。 加上CloseHandle(m_osWrite.hEvent)即可;

另一处出错的地方如下所示:

    OVERLAPPED m_osRead;
    memset(&m_osRead,0,sizeof(OVERLAPPED));
    m_osRead.Internal = 0;
    m_osRead.InternalHigh = 0;
    m_osRead.Offset = 0;
    m_osRead.OffsetHigh = 0;
    m_osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

这是在ReadFile用到,照样使用CloseHandle(m_osRead.hEvent)即可。

另外一些常见句柄释放方式:

HDEVINFO                 hardwareDeviceInfo;

创建方式:

hardwareDeviceInfo = 
        SetupDiGetClassDevs ( pGuid,
        NULL, // Define no enumerator (global)
        NULL, // Define no
        (DIGCF_PRESENT |           // Only Devices present
        DIGCF_DEVICEINTERFACE)); // Function class devices.
释放方式:
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);[喝小酒的网摘]http://blog.const.net.cn/a/3130.htm

posted on 2013-11-22 15:20  Lingc·  阅读(8690)  评论(1编辑  收藏  举报

导航

不知道不知道 知道不知道 知道知道 不知道知道。
天道酬勤,同志们共同努力!