Coding Life

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

话说好久没写点东西了,趁现在不是很忙就来感叹一番吧。本来时至今日现在还用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的说。

posted on 2010-11-03 17:14  yonken  阅读(2209)  评论(0编辑  收藏  举报