• 句柄数不停增加


    原来的程序:
    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

  • 相关阅读:
    CoreLocation
    通知(NSNotificationCenter)
    加载xib文件
    UITextField
    UIButton
    UILabel
    UIAlertController
    layoutSubviews
    Java AQS详解(转)
    Java中synchronized
  • 原文地址:https://www.cnblogs.com/lingc/p/3437629.html
Copyright © 2020-2023  润新知