我有一个代码,我在unordered_map中插入一个struct。
INFO Info( v1, UINT_MAX, v3, v4, v5 );
hmap_.insert( std::pair< key,INFO >( v1, Info ) );
在上面一行我使用gdb设置了一个断点并打印了所有变量的值:所有都很好按预期打印。
(gdb) p Info
$4 = {v1_ = valid_value, v2 = valid_value, v3 = , v4 = valid_value, v4 = valid_value}
现在我使用
进入哈希映射的插入函数(gdb) s
我得到了
(gdb) s
std::pair<unsigned long, namespace::class::Info>::pair<unsigned long&, namespace::class::Info&, true> (this=0x7fffffffd7e0, __x=@0x7fffffffd768: 1100000000000549, __y=...) at /usr/include/c++/7/bits/stl_pair.h:331
331 : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
(gdb) n
Thread 1 "test_1" received signal SIGFPE, Arithmetic exception.
0x000055555556b105 in std::__detail::_Mod_range_hashing::operator() (this=0x555555e09ec0, __num=1100000000000549, __den=0) at /usr/include/c++/7/bits/hashtable_policy.h:448
448 { return __num % __den; }
正如在gdb中可以看到的那样:在进行散列时,它会产生分母,它是从第二个变量生成的,它的值已打印且正确,为零(__den = 0)!
我在另一个带有普通构造函数的文件中有一个struct Info:
struct INFO
{
Info():
v1_( 0 ), v2_( UINT_MAX ), v_3( INVALID ),
v4_( 0 ), v5_( 0 )
{}
Info( value_type1 v1, const value_type2& v2,
value_type3 v3, value_type4 v4, value_type5 v5 ):
v1_( v1 ), v2_( v2 ),
v3_( side ), v4_( v4 ), v5_( v5 )
{}
value_type1 v1_ ;
value_type2 v2_ ;
value_type3 v3_ ;
value_type4 v4_ ;
value_type5 v5_ ;
};
为什么在对我所猜测的deomator进行散列时,从该对的第二个值(即有效值)创建的数据将变为零并生成算术异常。 感谢