免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2752 | 回复: 6
打印 上一主题 下一主题

[C++] 请教gnu:hash_set:中的数据? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-10 16:39 |只看该作者 |倒序浏览
本帖最后由 xxfihm_cu 于 2012-11-10 16:41 编辑

小弟遇到一个问题,之前用了个
typedef __gnu_cxx::hash_set<const char*>  StringSet;
StringSet x;
的数据,初始化的时候只插入了一个字符串
x.insert("abc");
本来运行的好好的,

但是今天改了项目的其他部分的代码,这部分的代码没动到之前那个x数据,但是内存可能就被搞坏了,启动进程后coredump,
挂在x.insert()里 ,我看过core文件,在hashtable重新申请内存的时候挂了,bucket的几个指针已经错乱了。
我也跟过这几个数据,甚至用watch *(long*)addr的方式,但是都没断到修改的地方,后来发现在hash_set构造完成后,
成功返回了,但是返回后gdb看hashtable的数据却已经是错乱了,不然也不会在第一次insert就执行resize了(hashset默认193的vec大小)。

但是我直接在小程序里测试是不会这样的,而且之前也跑的好好的。
另外我想可能是这次修改不小心碰到了什么,但是根据svn的修改记录一个个过滤也没发现与这个有问题的。
真tmd郁闷,查了好段时间了。不懂哪里内存被搞乱了。

其他数据都没错,就是第一个hash_set的第一个内存数据估计是个指针,请教是什么内容?



(gdb) p x
$1 = {
  _M_ht = {
    _M_node_allocator = {
      <__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<char const*> >> = {<No data fields>}, <No data fields>},
    _M_hash = {<No data fields>},
    _M_equals = {
      <std::binary_function<char const*, char const*, bool>> = {<No data fields>}, <No data fields>},
    _M_get_key = {
      <std::unary_function<char const*, char const*>> = {<No data fields>}, <No data fields>},
    _M_buckets = {
      <std::_Vector_base<__gnu_cxx::_Hashtable_node<char const*>*, std::allocator<__gnu_cxx::_Hashtable_node<char const*>*> >> = {
        _M_impl = {
          <std::allocator<__gnu_cxx::_Hashtable_node<char const*>*>> = {
            <__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<char const*>*>> = {<No data fields>}, <No data fields>},
          members of std::_Vector_base<__gnu_cxx::_Hashtable_node<char const*>*, std::allocator<__gnu_cxx::_Hashtable_node<char const*>*> >::_Vector_impl:
          _M_start = 0x804c008,
          _M_finish = 0x804c30c,
          _M_end_of_storage = 0x804c30c
        }
      }, <No data fields>},
    _M_num_elements = 1
  }
}
(gdb) p &x
$2 = (StringSet *) 0xbffff84c
(gdb) x/12wx 0xbffff84c
0xbffff84c:     0x00506f50      0x0804c008      0x0804c30c      0x0804c30c
0xbffff85c:     0x00000001      0x0804c310      0xbffff84c      0x0804aa01
0xbffff86c:     0x0804aae7      0x0804c310      0xbffff84c      0xbffff800
(gdb) x/12 0x00506f50
0x506f50 <__cxa_atexit_internal+32>:    0xffb8c289      0x85ffffff      0x8b1e74d2      0x33650c45
0x506f60 <__cxa_atexit_internal+48>:    0x00001835      0x04728900      0x8b084289      0x42891045
0x506f70 <__cxa_atexit_internal+64>:    0xc7c0310c      0x00000402      0x241c8b00      0x0424748b


就是这个0xbffff84c  是什么鸟来的?

is there any one can help me?

论坛徽章:
0
2 [报告]
发表于 2012-11-10 16:50 |只看该作者
自己先顶下。

上面贴的gdb的数据是32位上的  所以指针都是4byte   挂的时候是在64位机器上   具体区别等会儿贴出来

论坛徽章:
0
3 [报告]
发表于 2012-11-10 17:29 |只看该作者
大侠呢  呼唤大侠

论坛徽章:
0
4 [报告]
发表于 2012-11-10 17:56 |只看该作者
x86_64 redhat, 问题,hash_set在构造后变成这样了:
m_broad_gs_cmd = {
    <__gnu_cxx::hash_set<char const*, ZQGame::hash, ZQGame::key_equal, std::allocator<char const*> >> = {
      _M_ht = {
        _M_node_allocator = {
          <__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<char const*> >> = {<No data fields>}, <No data fields>},
        _M_hash = {<No data fields>},
        _M_equals = {
          <std::binary_function<char const*, char const*, bool>> = {<No data fields>}, <No data fields>},
        _M_get_key = {
          <std::unary_function<char const*, char const*>> = {<No data fields>}, <No data fields>},
        _M_buckets = {
          <std::_Vector_base<__gnu_cxx::_Hashtable_node<char const*>*, std::allocator<__gnu_cxx::_Hashtable_node<char const*>*> >> = {
            _M_impl = {
              <std::allocator<__gnu_cxx::_Hashtable_node<char const*>*>> = {
                <__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<char const*>*>> = {<No data fields>}, <No data fields>},
              members of std::_Vector_base<__gnu_cxx::_Hashtable_node<char const*>*, std::allocator<__gnu_cxx::_Hashtable_node<char const*>*> >::_Vector_impl:
              _M_start = 0x8b6c8800000000,
              _M_finish = 0x8b6c8800000000,
              _M_end_of_storage = 0x0
            }
          }, <No data fields>},
        _M_num_elements = 0
      }
    }, <No data fields>}
}
---------------------

论坛徽章:
0
5 [报告]
发表于 2012-11-10 18:24 |只看该作者
还是自己来结贴了

问题找到了  是字节对齐的问题

include了一个新的文件  里面 #pragma pack(1)了 后面没解除   导致内存乱了

终于解决了。。。

论坛徽章:
0
6 [报告]
发表于 2012-11-10 18:40 |只看该作者
不过还是不明白 开头的那个内存指针是干什么用的  可能几个  _M_hash  _M_equals   空结构体默认的空间?

论坛徽章:
0
7 [报告]
发表于 2012-11-10 18:59 |只看该作者
我去。。。又单机了么。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP