注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

g++:双层map表的崩溃问题, g++编译map的BUG?  

2010-10-19 15:25:03|  分类: linux、FreeBSD等 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

变量声明:
typedef CLanguageNode * P_CLanguageNode;

 

typedef  map<string, CLanguageNode>LANGUAGE_SECTION_MAP;
typedef LANGUAGE_SECTION_MAP::iterator LANGUAGE_SECTION_MAP_ITERATOR;

typedef  map<string, LANGUAGE_SECTION_MAP>LANGUAGE_MAP;
typedef LANGUAGE_MAP::iterator LANGUAGE_MAP_ITERATOR;

变量:LANGUAGE_MAP m_list;

 

第一种情况:
    for(LANGUAGE_MAP_ITERATOR piter=m_list.begin(); piter!=m_list.end(); piter++)
    {
        for(LANGUAGE_SECTION_MAP_ITERATOR piter1=piter->second.begin(); piter1!=piter->second.end(); piter1++)
        {
            P_CLanguageNode node=&piter1->second;        //崩溃

            printf("%s\t\t=%s\n", node->GetID(), node->GetName());
        }
    }

第二种情况:

m_list[language][ID];        //偶尔查询不到对应的节点。

 

这两个奇怪的问题!

机器配置是Ubuntu系统+GCC编译器。

 

第一个问题,原因不详。还不熟悉gcc的调试,这个问题保留。

第二个问题,string类作为key键值时,比较字符串大小上存在问题。导致键map时出错。可能是我下载了旧版本的stl库导致的? 我使用的是stdext 2.2 (vc版),更新到2.3版本,问题依旧。

 

http://gcc.gnu.org/ml/gcc-bugs/1999-08n/msg01030.html

照此看来,第一个问题也是g++的BUG了?

不过,这个写法却没有问题,m_list[string1][string2].

 

http://gcc.gnu.org/ml/gcc-help/1999-q3n/msg00059.html

http://pc.sheup.com/pc/6/pc18609.htm

 

因为我打印出的键值是“ID123”,而我类似这样调用m_list["ID123"],却得到空的结果,很令人费解!

 

解决!

对于map<string, ***>的结构,如果这样插入,

string str="test";

m_list.insert(make_pair(str, ***);

那么,基本上会出现我上面提到的问题!

而如果写成这样,m_list.insert(make_pair(str.c_str(), ***);,就正常了!

 

估计第一个问题也是类似的情况。可能和g++对STL的支持有关。

 

By:zhanyonhu

  评论这张
 
阅读(967)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016