在结构数组中访问 std::unordered_map 时出现浮点错误
Floating point error when accessing std::unordered_map in array of structs
我的代码生成一个结构的C数组,其中结构的一个成员是STL std::unordered_map:
typedef struct test_s {
int count_a;
std::unordered_map<std::string, int> my_map;
} test_map;
typedef struct cm_example {
int width;
test_map *counts;
unsigned int hasha, hashb;
} cm_sketch;
但是,当我尝试访问地图以执行查找,插入等时。我总是遇到浮点异常:
Compile: g++ -std=c++11 -g test_struct.cpp -o h_str
Run: ./h_str_str agggcctttgagag 100
Output:
Kmer name: agggcctttgagag
hash_a: 172110908 , hash_b: 1954003865, bucket: 92
Floating point exception
我的代码如下:
cm_sketch *cm_init (int width, int seed)
{
cm_sketch *cm;
int i=0;
cm = (cm_sketch *) malloc(sizeof(cm_sketch));
cm->width = width;
cm->counts = (test_map *) malloc (sizeof(test_map) * width);
for (i=0; i<width; i++) {
cm->counts[i].count_a = 0;
}
cm->hasha = 172110908;
cm->hashb = 1954003865;
return cm;
}
int main(int argc, char *argv[])
{
int bucket_id=0;
if (argc < 2)
{
printf ("Please provide correct number of input arguments: n");
printf ("./exe 1:k-mer 2:wn");
exit (0);
}
char *kmer_input = argv[1];
int width = atoi(argv[2]);
std::string kmer_name = kmer_input;
std::cout << "Kmer name: " << kmer_name;
printf("n");
cm_sketch *cm = cm_init(width, time(NULL));
unsigned int hashval = hash_str(kmer_input);
bucket_id = hash31(cm->hasha, cm->hashb, hashval) % cm->width;
std::unordered_map<std::string, int>::const_iterator got;
printf ("hash_a: %d , hash_b: %d, bucket: %d n", cm->hasha, cm->hashb, bucket_id);
got = cm->counts[bucket_id].my_map.find(kmer_name); /* FLOATING POINT ERROR */
if (got == cm->counts[bucket_id].my_map.end())
cm->counts[bucket_id].my_map[kmer_name] = 1;
else
cm->counts[bucket_id].my_map[kmer_name]++;
// Iterate and print keys and values of unordered_map
for( const auto& n : cm->counts[bucket_id].my_map ) {
std::cout << "Key:[" << n.first << "] Value:[" << n.second << "]n";
}
return 0;
}
浮点误差可能是"除以零"的原因。但是,这里的错误是内部的。在 gdb 中运行给出了以下内容:
Program received signal SIGFPE, Arithmetic exception.
0x00000000004018f1 in std::__detail::_Mod_range_hashing::operator() (this=0x607768, __num=10758833940372818866, __den=0)
at /opt/gcc/4.9.3/snos/include/g++/bits/hashtable_policy.h:449
449 { return __num % __den; }
(gdb) bt
#0 0x00000000004018f1 in std::__detail::_Mod_range_hashing::operator() (this=0x607768, __num=10758833940372818866, __den=0)
at /opt/gcc/4.9.3/snos/include/g++/bits/hashtable_policy.h:449
#1 0x00000000004021cc in std::__detail::_Hash_code_base<std::string, std::pair<std::string const, int>, std::__detail::_Select1st, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::_M_bucket_index (this=0x607768,
__c=10758833940372818866, __n=0) at /opt/gcc/4.9.3/snos/include/g++/bits/hashtable_policy.h:1266
#2 0x0000000000401d68 in std::_Hashtable<std::string, std::pair<std::string const, int>, std::allocator<std::pair<std::string const, int> >, std::__detail::_Select1st, std::equal_to<std::string>, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_bucket_index (this=0x607768, __k=...,
__c=10758833940372818866) at /opt/gcc/4.9.3/snos/include/g++/bits/hashtable.h:614
#3 0x0000000000401ac6 in std::_Hashtable<std::string, std::pair<std::string const, int>, std::allocator<std::pair<std::string const, int> >, std::__detail::_Select1st, std::equal_to<std::string>, std::hash<std::string>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::find (this=0x607768, __k=...)
at /opt/gcc/4.9.3/snos/include/g++/bits/hashtable.h:1303
#4 0x0000000000401969 in std::unordered_map<std::string, int, std::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, int> > >::find (this=0x607768, __x=...) at /opt/gcc/4.9.3/snos/include/g++/bits/unordered_map.h:574
#5 0x00000000004015cb in main (argc=3, argv=0x7fffffff7618) at test_struct.cpp:100
我对C++不是很熟悉,而且我一直在为这段代码而苦苦挣扎。请帮助隔离错误。我错过了什么吗?我是否正确访问hash_map条目?
您的代码具有未定义的行为。 当您使用
cm = (cm_sketch *) malloc(sizeof(cm_sketch));
您为cm_sketch
分配了足够的存储空间,并且必须指向它cm
。 malloc
虽然不会为您创建的对象调用构造函数。 所以现在你有一个对象,其中所有成员都未初始化。 使用这些未初始化的变量是未定义的行为。
如果需要指针和动态内存分配,则应使用 new
来分配存储,并在完成后使用 delete
来释放它。 new
将调用构造函数以确保您创建的对象已初始化,delete
将调用析构函数,该析构函数将销毁类包含的所有成员。
相关文章:
- C++将参数包传递给std::map导致错误C3245
- c++:[错误]"map"之前的预期初始值设定项
- 编译器错误 C2664 使用 std::map 和自定义类作为其值
- std::map 擦除 - 将迭代器传递给错误的映射
- 带有 std::map 的模板函数给出错误:变量或字段声明为 void
- 尝试 ptr->map.clear() 时出现分段错误
- 错误:与'operator='不匹配(操作数类型为"std::map<int、double>::iterator
- 使用std :: map时,包含unique_ptr的结构中的默认破坏者会导致编译错误
- 自动,错误:MAP ITERATOR没有名为“ First”的成员
- 将项目插入到std :: map时错误
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- 如何在<int>错误 C2338 中组织 map<set<multiset>,int> C++
- 在 std::map 中使用结构作为值时出现运行时错误
- map.insert:"Invalid arguments"错误与 pair<enum,vector<*>>
- SWIG:包装 std::map<key 时编译器错误,val *>
- 使用 std::map 时只读成员的错误递减
- 为什么缩小转换范围不能防止错误类型的map.insert()失败
- 错误 C2062:引用 std::map 时键入意外
- Qt nmake:错误 C3203:"map":非专用类模板不能用作模板参数"base"的模板参数,预期为真实类型
- 罗马数字基本算法中基于字符串的错误(使用std::map)