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