句柄數不停增加


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM