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