自己接触的项目基本都是用vc2003写的.这几天因为贪图vc6.0写的dll小(不必静态连接嘛).所以用上了这个"老家伙".而以前的程序都不是UNICODE字符集的,考虑到国际化,所以这个DLL就用UNICODE字符集了. dll的接口定义好后,又写了几个类.然后用MFC对话框程序来测试这个dll.可要命的是,vc6老是提示有内在泄露.如下:Detected memory leaks!Dumping objects ->{51} normal block at 0x003B2E80, 33 bytes long. Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD {50} normal block at 0x003B2E18, 40 bytes long. Data: < |L > 14 7C 4C 10 16 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. 我检查了所有该释放内存的地方都释放了.还是提示内在泄露...我动用了内存泄露检查工具(AQTime5),却没找到有内存泄露的地方...是怎么回事呢? 最后,我只是在测试工程里加上dll导出来的api,而没有调用.还是提示有内在泄露...怎么回事?我确认,如果dll导出的api没有被调用,dll里就绝对不会有对象被实例化! 可是,这样怎么还是说有内在泄露?我要抓狂了:(.... 没法,还是要找到问题出在哪里啊.我就把dll的类一个一个注释掉,把dll中的文件从工程中一个一个移除掉...把一个类里的一个变量或一个成员函数注释掉...终于发现是在一个线程类里有这样一个成员变量:wstring m_strThreadName,只要注视掉它,就不会有内在泄露的提示,只要加上就有. 真晕,这个线程类都还没有被实例化呢.为了验证是vc6生成长歪了,我用它写了一个很简单的dll,只导出一个add的api,这个api做了一个1+1的运算,然后返回. 测试后,没问题.我又增加了一个类,并加上了一个成员变量: wstring m_name,不实例化它. 再次测试果然提示有内存泄露,和前一个dll的提示一模一样!! 我晕菜后醒来,真想拿头撞墙,最后考虑再三,只是一口气做了N个俯卧撑(N<=5,发现右手经常握鼠标,经年累月后,在手腕和手掌关节处的骨头长长了,成不了90度了.做俯卧撑时疼痛难忍,看样子,要经常锻炼身体才对) 用vc2003或以上的版本测试,没有这个内存泄露的提示. 哎,应该彻底的把vc6仍到厕所里了(对模板支持太差,可也怪不了人家,它出生太早).说不定又会莫名其妙的闹鬼....
posted on 2008-05-10 00:24
冰风谷 阅读(1026)
评论(2) 编辑 收藏 引用 所属分类:
冰风手记 、
编程中的贝壳