句柄数不停增加

2024-03-27 11:48
文章标签 句柄 增加 不停

本文主要是介绍句柄数不停增加,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

句柄数不停增加

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

这篇关于句柄数不停增加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852009

相关文章

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

STM32F103调试DMA+PWM 实现占空比逐渐增加的软启效果

实现效果:DMA+PWM 实现PWM输出时,从低电平到输出占空比逐渐增加再到保持高电平的效果,达到控制 MOS 功率开关软启的效果。 1.配置时钟 2.TIM 的 PWM 功能配置 选择、配置 TIM 注意:选择 TIM 支持 DMA 控制输出 PWM 功能的通道,有的TIM通道支持PWM 但不支持PWM注意选择。 PWM参数设置 Counter Period :

sqlserver2008增加、修改表字段不能保存,提示“阻止保存要求重新创建表的更改”的解决办法

sqlserver2008增加、修改表字段不能保存,提示“阻止保存要求重新创建表的更改”,如下图所示 解决办法:

【日常记录-Java】SpringBoot对静态资源增加权限校验

Author:赵志乾Date:2024-09-05Declaration:All Right Reserved!!! 1. 简介         在SpringBoot中,静态资源默认是通过SpringMVC的ResourceHttpRequestHandler来处理的,这些资源通常放置在src/main/resources/static、src/main/resources/public

句柄和TCB

句柄到底是什么?TCB又是什么?C代码实例讲解_c 句柄-CSDN博客 修正代码 你需要在 aht20_create 函数的末尾添加一个 return 语句,以返回创建的句柄。修正后的函数应如下所示: aht20_handle_t aht20_create(i2c_port_t port, uint8_t ATH20_SLAVE_ADDRESS ) { aht20_dev_t *se

GoFly企业版里的阿里图标如何增加自定义图标到后台

1.在使用的vue页面引入图标组件 <script lang="ts" setup>import {Icon} from '@/components/Icon';</script> 2.在具体位置使用 <template><Icon icon="svgfont-icon7" class="iconbtn" :size="18" color="#ed6f6f"></Icon></templat

Matlab_learning_4( 函数句柄 )

含数句柄是MATLAB 6之后特有的语言结构;      优点:                方便函数之间互相调用,兼容函数加载;               拓宽子函数包括局部函数的适用范围;               减少程序设计之中的冗余;               提高重复执行的效率;               数组、结构数组、细胞型数组能够结合定义数据;

带有增加与减少按钮的数量选择控件QuantityView

带有增加与减少按钮的数量选择控件 用法: <me.himanshusoni.quantityview.QuantityView     xmlns:app="http://schemas.android.com/apk/res-auto"     android:id="@+id/quantityView_default"     android:layout_width="w