C std :: unordered_set SIGFPE异常

weixin_38081265 2019-09-12 01:32:31
我写了一个程序,我很开心我已经运行了几十次 – 我甚至写下了多次执行的结果 – 现在它不起作用. 你可能会认为我说风筝很高,或者我可能只是改变了一些线条,但我真的不记得在程序上做了任何改动. 根据输入,问题是SIGFPE,它在程序的不同执行中升起.虽然在std :: unordered_set< Point< T>中插入值时引发了信号但是发生了. *取代. 这是我执行此类插入的代码片段: std::vector<Point<T> *> _point, _centroid; std::vector<std::unordered_set<Point<T> *> > _cluster; // Main procedure -- pseudocode for (point in _point) { cluster_id = centroid_with_min_distance(point, _centroid); has_changed = _change_cluster(point, cluster_id); } // Changes from one "point->_cluster's unordered_set" to "c's unordered_set" bool _change_cluster(Point<T> *point, const unsigned int& c) { if ((point->_cluster == c) && (_cluster[c].find(point) != _cluster[c].end())) { return false; } _cluster[point->_cluster].erase(point); _cluster[c].insert(point); // Insertion that raises the SIGFPE exception point->_cluster = c; return true; } 这是valgrind输出的一个重要部分: ==17636== Invalid read of size 8 ==17636== at 0x40A758: std::pair<std::__detail::_Hashtable_iterator< Point<unsigned int>*, true, false>, bool> std::_Hashtable<Point<unsigned int>*, Point<unsigned int>*, std::allocator<Point<unsigned int>*>, std::_Identity<Point<unsigned int>*>, std::equal_to<Point<unsigned int>*>, std::hash<Point<unsigned int>*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, true, true>:: _M_insert<Point<unsigned int>* const&>( Point<unsigned int>* const&&&, std::integral_constant<bool, true>) (hashtable.h:966) ==17636== by 0x408EDA: std::_Hashtable<Point<unsigned int>*, Point<unsigned int>*, std::allocator<Point<unsigned int>*>, std::_Identity<Point<unsigned int>*>, std::equal_to<Point<unsigned int>*>, std::hash<Point<unsigned int>*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, true, true>:: insert(Point<unsigned int>* const&) (hashtable.h:400) ==17636== ... (calls from my program) ... ==17636== Address 0x620a028 is not stack'd, malloc'd or (recently) free'd ==17636== ==17636== ==17636== Process terminating with default action of signal 8 (SIGFPE) ==17636== Integer divide by zero at address 0x402D07D7C ==17636== at 0x40252F: std::__detail::_Mod_range_hashing::operator()( unsigned long, unsigned long) const (hashtable_policy.h:376) ==17636== by 0x40A66C: std::__detail::_Hash_code_base<Point<unsigned int>*, Point<unsigned int>*, std::_Identity<Point<unsigned int>*>, std::equal_to<Point<unsigned int>*>, std::hash<Point<unsigned int>*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index( Point<unsigned int>* const&, unsigned long, unsigned long) const (hashtable_policy.h:758) ==17636== by 0x40A772: std::pair<std::__detail::_Hashtable_iterator< Point<unsigned int>*, true, false>, bool> std::_Hashtable<Point<unsigned int>*, Point<unsigned int>*, std::allocator<Point<unsigned int>*>, std::_Identity<Point<unsigned int>*>, std::equal_to<Point<unsigned int>*>, std::hash<Point<unsigned int>*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, true, true>:: _M_insert<Point<unsigned int>* const&>( Point<unsigned int>* const&&&, std::integral_constant<bool, true>) (hashtable.h:966) ==17636== by 0x408EDA: std::_Hashtable<Point<unsigned int>*, Point<unsigned int>*, std::allocator<Point<unsigned int>*>, std::_Identity<Point<unsigned int>*>, std::equal_to<Point<unsigned int>*>, std::hash<Point<unsigned int>*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, true, true>:: insert(Point<unsigned int>* const&) (hashtable.h:400) ==17636== ... (calls from my program) ... 这里的问题是:因为我在我的程序中有计算可能导致除以零 – 它们与此过程没有直接关系 – 但是,错误是否可能被插入阴影?或者我应该在std :: unordered_set< T>?中插入指针时做一些额外的处理? 我正在编译x86_64 GNU / Linux下的程序,我正在使用g(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3.
...全文
159 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38091479 2019-09-12
  • 打赏
  • 举报
回复
我怀疑’c’超出了_cluster的范围.你能用_cluster.at(c)替换所有的_cluster [c],看它是否发现超出范围的错误. valgrind输出表明它是无效读取,后跟整数模数误差.由于它正在执行hash_code%bucket_count,我怀疑你访问了向量的范围. 顺便说一句,命名以_开头的东西可能有风险,就像它在全局命名空间中一样,它在技术上保留用于实现.

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧