2012-11-27 15 views
8

तक पहुँचने मैं ब्लॉक एक सरल struct के रूप में परिभाषित किया जा रहा है के साथ एक unordered_map<Block, int> इस प्रकार है:SIGFPE जब unordered_map

struct Block { 
    size_t start; 
    size_t end; 

    bool operator==(const Block& b) const { 
     return start == b.start && end == b.end; 
    } 
}; 

namespace std { 
template<> 
struct hash<Block> { 
    size_t operator()(const Block& b) const { 
     return b.start; 
    } 
}; 
} 

जब नक्शे का उपयोग करने की कोशिश कर रहा है, मैं gdb में निम्न त्रुटि संदेश (दोनों जी ++ 4.7 के लिए एक ही मिलता है .1 रूप में अच्छी तरह बजना ++ 3.1) के रूप में:

Program received signal SIGFPE, Arithmetic exception. 
0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0) 
    at /usr/include/c++/4.7/bits/hashtable_policy.h:245 
245  { return __num % __den; } 

मेरे libstdC++ संस्करण है 3.4.17 (यानी जीसीसी 4.7 से संस्करण)

प्रासंगिक पश्व-अनुरेखन:

#0 0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0) 
    at /usr/include/c++/4.7/bits/hashtable_policy.h:245 
#1 0x0000000000407199 in std::__detail::_Hash_code_base<Block, std::pair<Block const, int>, std::_Select1st<std::pair<Block const, int> >, std::hash<Block>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::_M_bucket_index (this=0x7fffffffd8e0, __c=0, __n=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:787 
#2 0x0000000000405230 in std::_Hashtable<Block, std::pair<Block const, int>, std::allocator<std::pair<Block const, int> >, std::_Select1st<std::pair<Block const, int> >, std::equal_to<Block>, std::hash<Block>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, true, false, true>::_M_bucket_index 
    (this=0x7fffffffd8e0, __k=..., __c=0) at /usr/include/c++/4.7/bits/hashtable.h:466 
#3 0x00000000004038de in std::__detail::_Map_base<Block, std::pair<Block const, int>, std::_Select1st<std::pair<Block const, int> >, true, std::_Hashtable<Block, std::pair<Block const, int>, std::allocator<std::pair<Block const, int> >, std::_Select1st<std::pair<Block const, int> >, std::equal_to<Block>, std::hash<Block>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, true, false, true> >::at (
    this=0x7fffffffd8e0, __k=...) at /usr/include/c++/4.7/bits/hashtable_policy.h:474 
#4 0x0000000000403001 in SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}::operator()(Block const&) const (__closure=0x7fffffffd990, block=...) at splicing.cpp:151 
#5 0x00000000004040b3 in std::for_each<__gnu_cxx::__normal_iterator<Block const*, std::vector<Block, std::allocator<Block> > >, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}>(__gnu_cxx::__normal_iterator<Block const*, std::vector<Block, std::allocator<Block> > >, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}) (__first=..., __last=..., __f=...) 
    at /usr/include/c++/4.7/bits/stl_algo.h:4442 

संपादित करें: मुझे नहीं लगता था कि यह वास्तव में एक फर्क जहां मैं समारोह के रूप में लंबे समय से मैं यह एक ही तर्क देना के रूप में फोन होगा, लेकिन जाहिरा तौर पर यह होता है:

std::for_each(blocks.begin(), blocks.end(), [&](const Block& block) { 
    map.at(block); 
} 

सुराग त्रुटि के लिए, बस करते हुए:

const Block& block = blocks[0]; 
map.at(block); 

काम करता है बिल्कुल ठीक (blocks जा रहा है एक सरल vector<Block>&)

+0

आपकी समस्या से संबंधित नहीं है, लेकिन आपको कभी भी कार्य/कक्षाएं/आदि नहीं रखना चाहिए। 'std' नेमस्पेस में। –

+0

यहां संभावित डुप्लिकेट http://stackoverflow.com/questions/8286103/strange-unordered-map- स्थिति –

+0

@ सर्गी मैंने देखा कि एक, लेकिन समाधान में मेरी समस्या के साथ कुछ भी नहीं लगता है - पूरे कोड वास्तव में एक ही हेडर फ़ाइल में है (और हाँ मुझसे बेवकूफ यह ध्यान में नहीं है कि मूल प्रश्न में, mea culpa)। – Voo

उत्तर

5

इसके अलावा: यदि आपका हैश फ़ंक्शन फेंक नहीं सकता है तो इसे noexcept अपवाद-विनिर्देश देने के लिए काफी महत्वपूर्ण है, अन्यथा हैश तालिका को तत्व के साथ प्रत्येक तत्व के हैश कोड को स्टोर करने की आवश्यकता है (जो स्मृति उपयोग को बढ़ाता है और प्रदर्शन को प्रभावित करता है) उस कंटेनर ऑपरेशंस जिन्हें फेंकना नहीं है, को हैश कोड को फिर से समझना नहीं है।

SIGFPE शून्य द्वारा विभाजन का तात्पर्य और पश्व-अनुरेखन से इसे यहाँ होता है:

{ return __num % __den; } 

जो शायद मतलब है __den शून्य है। वह मान हैश मैप की बाल्टी गिनती से आता है, जो शून्य नहीं होना चाहिए।

क्या आप पुष्टि कर सकते हैं कि m._M_bucket_count क्रैश होने पर यह शून्य है?

यदि ऐसा है तो

, कि या तो यह संकेत करता है कि आप नक्शे किसी भी तरह भ्रष्ट कर दिया है या वहाँ libstdC++ कोड में एक बग है (आप -D_GLIBCXX_DEBUG साथ संकलन libstdC++ डीबग मोड चेकों को चालू करने की कोशिश की? आप valgrind के तहत चल रहा की कोशिश की? है)।

4

मुझे बिल्कुल वही समस्या थी। यह गलती से कंटेनर डेटा पर गलती से लागू किया गया था।

2

मेरे मामले में स्थिर इन्सिट फियास्को की वजह से एक ही समस्या आई। एक ऑब्जेक्ट फ़ाइल से मैंने स्थिर std :: unordered_map के लिए इमस्थल विधि कहा है जिसे दूसरी ऑब्जेक्ट फ़ाइल में परिभाषित किया गया था। प्रारंभिक डेटा की वजह से बीएसएस में था, बाल्टी गिनती का मूल्य शून्य => SIGFPE था।

संबंधित मुद्दे