话说好久没写点东西了,趁现在不是很忙就来感叹一番吧。本来时至今日现在还用VC6开发已经是个悲剧了(毕竟已经是1998年的东西了,如果没搞错的话),面对VC6的各种烦人的bug那更是悲剧。
今天刚改了点code,在某个类里面加了个method,如下:
typedef map<int, Data*> CIntDataMap; void RemoveIntData() { for (CIntDataMap::iterator iter = m_mapIntData.begin(); iter != m_mapIntData.end(); ++iter) { ASSERT( iter->second ); delete iter->second; } m_mapIntData.clear(); }
本来这是在这个类的dtor里面调用的,后来在某个地方也调用了一下,结果就悲剧的crash了。
一开始百思不得其解,跟了一段时间才发现是std::map 有个static 成员 _Nil,用来把空的树节点指向它的地址,而这个_Nil是在第一个_Tree类的构造函数里面初始化的。本来这样是没啥问题,节省了时间,性能又好,但是一旦跨模块使用就会导致问题了。比如有两个DLL,在A DLL里面new这个map然后传递到B DLL使用,这样两个DLL里面都分别有自己不同的_Nil,于是在operator++里面调用的函数就会出现判断错误而访问非法地址。当然了,我碰到的情况正好就是在两个DLL之间传递这个map!
google了一下这个问题,发现原来02年的时候已经有fix了:
http://www.dinkumware.com/vc_fixes.html
我当然不是第一个碰到这个问题的人:http://www.codeguru.com/forum/archive/index.php/t-258256.html
唉,真是无奈,不知道公司何时才能改上VS2010的说。