PCSC那事儿(十五--SCardFreeMemory)

本文详细解析了SCardFreeMemory函数的工作原理,包括其在特定上下文中如何释放内存,以及与之相关的SCardCheckDaemonAvailability函数的作用。文章还讨论了在不同情况下可能产生的内存泄漏问题。
部署运行你感兴趣的模型镜像

 

SCardFreeMemory

定义在 winscard_clnt.c

实现如下:

3321 LONG SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem)

3322 {

3323         LONG rv = SCARD_S_SUCCESS;

3324         LONG dwContextIndex;

3325

3326         PROFILE_START

3327

3328         rv = SCardCheckDaemonAvailability();

3329         if (rv != SCARD_S_SUCCESS)

3330                 return rv;

3331

3332         /*

3333          * Make sure this context has been opened

3334          */

3335         dwContextIndex = SCardGetContextIndice(hContext);

3336         if (dwContextIndex == -1)

3337                 return SCARD_E_INVALID_HANDLE;

3338

3339         free((void *)pvMem);

3340

3341         PROFILE_END(rv)

3342

3343         return rv;

3344 }

 

 

实际上 SCardFreeMemory 必然也是 free 些资源 . 但是毕竟是 ResourceManager 给你分了内存,所以得有些特殊处理。

SCardCheckDaemonAvailability 检查 pcscd 是否还活着。如果 pcscd 不在了,

testpcsc 可以不用归还内存了。如果在这之前,有其它线程调用了, SCardReleaseContext

说明这个上下文结束了。可以选择不归还,直接退出客户端。如果不退出客户端,而是重新

SCardEstablishContext, 重新来过,则内存泄露。

SCardCheckDaemonAvailability 的内部处理,在前面说过了,还有服务端重启,客户端 clone 自己。

都不会返回 SCARD_S_SUCCESS, 从而新 clone 出的客户端程序内存泄露。而服务器重启,直接引起这里的内存泄露。

 

SCardListReaderGroups 结束。

 

 

回到 testpcsc.c

141 wait_for_card_again:

142         mszGroups = NULL;

143         printf("Testing SCardListReaders/t: ");

144         rv = SCardListReaders(hContext, mszGroups, NULL, &dwReaders);

145         test_rv(rv, hContext, DONT_PANIC);

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值