CMapStringToString导致的内存释放问题

  






        

有一个无线网络共享的正常工作的软件,是一个MFC程序,里面网络共享的代码与界面操作的代码混在一块,今天想把它的网络共享部分的代码分离成一个dll,分离后再改造一下原来的程序来调用dll,编译执行,刚开始一切正常,正以为大功告成的时候退出时却提示遇到异常,细看是退出时卡在free.cheapfree函数上,很是郁闷,因为网络共享的代码的中含有一个类,我另外改造成用类厂来生成类,用DllGetClassFactoryObjectdll中调用类厂指针再动态生成类,原来的在一起的时候正常工作,既然改造后出问题,那应该是改造后的代码出问题,于是在类的生成和释放上好一顿找,确认没什么地方有问题,但还是在程序退出的时候提示释放内存出错。


    后来检查代码实在的找不出问题,于是一个一个的函数来定位,终于检查出在dll一个用CmapStringToString引用来保存结果的函数出问题,该函数在搜索无线网卡时在检测到有可用的无线网卡后添加键值对,用CmapStringToString来保存网卡设备描述与GUID,该引用参数是在程序里定义的变量,CmapStringToString是自动管理内存的释放的,在原来的程序里面不用管它的分配和释放也正常工作,现在这个函数放到dll中,在检测到有可用的无线网卡后添加键值对,但就是这个添加的动作引出问题,dll中给CmapStringToString分配的内存程序无法释放,但很奇怪这个CmapStringToString中保存的信息程序中却能正确获取到,因此出现前面的都能正常工作,只是在程序结束时释放内存才出问题。


找到问题了就好办了,再验证一下,注释掉添加键值对的语句,运行后退出时果然没再出释放内存的问题,CmapStringToString是自动管理内存的分配和释放的,不好插手,dll中的类一直存在直到程序结束才释放,干脆把CmapStringToString放在dll中,程序中只要获取到它的指针就可以了,通过它的指针来获取它保存的信息,于是再改造一番后再编译运行,OK,搞定了这个隐藏的在程序中定义,在dll中分配,又在程序中释放的奇怪问题。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值