分类:
2008-10-13 16:30:56
除虫记之九(糊涂的时间和MFC 1小时/1人)
累啊,连续的加班捉虫,搞的我疲惫不堪,天啊。
刚才我的机器碰到了一个前所未闻的故障,我上午从内部网软件服务器上装了一个金山词霸2003,然后又做了xp更新,结果重启后机器就用不起来了,鼠标点哪儿都报告explorer程序错误,天哪,什么乱七八糟的。重启n次都是这个,下午在安全模式里面把所有的更新都卸载了,还是不行,在安全模式重现更新,还是不行,搞了一天,不过在下午发现了一个转机,就是不用鼠标用键盘就没有这个问题了,用触摸屏的鼠标也不行,吃晚饭的时候,和另一个部门经理谈了这个事后,他搞了一会,把金山词霸退出,结果好了,气死我了,竟然是这个问题。
闲话少说,回到捉虫上来。
公测中有个别机器运行了一晚上后内存用到了几百M,这还了得,立刻开会讨论,决定发版推迟,解决内存泄漏问题。
分工,各自去查。
单表一枝:一个开发人员在追查的过程中,有个疑问,他用一个管理类管理一些new出来的对象,每个对象都有一个时间表示自己的生存期,他在管理类中启动一个定时器轮训检测每个对象是否过了生存期,如果过了生存期,就把对象释放掉,但他通过_CrtDumpMemoryLeaks方法发现好像是有一些对象应该过了生存期,但好像没有删除掉。
让我过去审核流程,我审核后发现流程没有什么问题,他把对象放到一个CMap表里面,定时器里面轮循检查,没有发现什么问题。
于是怀疑是不是数据计算上出了问题?
他的代码中用的是两个一个CTime结合GetCurrentTime记录每个对象的出生时间,用一个long整数表示生存期,检查的时候用CTimeSpan来判断,我没有用过CTimeSpan,对这个没有把握,建议换成time_t或者GetTickCount来计时,开发人员遵循了我意见,换成了GetTickCount,做了相关处理,运行后,高兴的向我报告,问题没有了,通过调试报告的日志可以看出该放的都放了,然后告诉了我可能的原因是两个CTime的差可能减出了负数导致判断错误,我没有对这个结论做进一步的调研。只是告诉他我没有用过CTimeSpan。
问题就这样解决了,我说不上原因,只能怀疑MFC封装中出了问题。
教训:如果有简单的win32API可用,不要用MFC。