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); |