2012-10-31 19 views
5

मेरे पास एक प्रोजेक्ट है जहां मैं काम कर रहा हूं जहां मेरे पास std नक्शे के साथ कुछ अजीब व्यवहार है।#pragma पैक त्रुटि के कारण स्मृति भ्रष्टाचार - std map भ्रष्टाचार - डालने पर क्रैशिंग

मेरे पास अपना स्वयं का टाइपिफ़ नक्शा परिभाषित किया गया था जो एक कस्टम प्रकार के सूचक के लिए तारों को मैप किया गया था। जब भी मैं मानचित्र पर पहली जोड़ी जोड़ता हूं, तो एप्लिकेशन किसी भी समय क्रैश हो जाता है।

बहुत सारे गड़बड़ के बाद मैंने मानचित्र को बदल दिया और इसे मेरे आवेदन में पहली कॉल में स्थानांतरित कर दिया और यह अभी भी दुर्घटनाग्रस्त हो गया। मुझे नहीं पता कि क्या हो रहा है। किसी भी सहायता की सराहना की जाएगी।

इस समय क्रैश होता है जो कोड है।

CISInterface Debug [C/C++ Application] 
    gdb/mi (10/31/12 6:02 PM) (Suspended) 
     Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.) 
      6 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() 0x00000032fd49c416  
      5 std::operator< <char, std::char_traits<char>, std::allocator<char> >() basic_string.h:2317 0x0000000000417ec7 
      4 std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator() stl_function.h:230 0x000000000041706f 
      3 std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_insert_unique() stl_tree.h:1170 0x0000000000415d00  
      2 std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::insert() stl_map.h:500 0x00000000004150eb 
      1 main() CISInterface.cpp:29 0x000000000041916d 
gdb (10/31/12 6:02 PM) 
/home/cillian/workspace/CISInterface/Debug/CISInterface (10/31/12 6:02 PM) 

क्या अन्य क्षेत्रों मैं समस्या खड़ी कर सकता है कि पर विचार करना चाहिए -

LoggerPtr syslogger(Logger::getLogger("CISInterface")); 

int main(int argc, char *argv[]) 
{ 
    typedef std::map<string, string> MyMapDef; 
    MyMapDef tmpString; 
    tmpString.insert(MyMapDef::value_type("0000", "d")); 
    tmpString.insert(MyMapDef::value_type("1111", "d")); //Crashes here. 
    tmpString.insert(MyMapDef::value_type("2222", "d")); 

// std::string configFile; 
// int c; 
// if(argc < 2) 
// { 
//  //Must have c option 
//  std::cout << "Usage -c configFileName" << std::endl; 
//  exit(EXIT_FAILURE); 
// } 
//Rest of main commented out. 
... 

और यहाँ स्टैक ट्रेस है। क्या यह उन पुस्तकालयों में हो सकता है जिन्हें मैं जोड़ रहा हूं? मैंने कोड की इन पंक्तियों के साथ एक दूसरी परियोजना बनाई है जो समान पुस्तकालयों से जुड़ा हुआ है (लेकिन उनमें कोई कोड नहीं है जो उन्हें कॉल करता है।) और यह क्रैश नहीं होता है।

+3

यदि आपके द्वारा पोस्ट किया गया कोड वास्तव में सभी कोड है, तो ** केवल ** चीज जो आपकी समस्या का कारण बन सकती है वह है 'लॉगरपीआरटी syslogger (लॉगर :: getLogger ("CISInterface")) के कारण भ्रष्टाचार ढेर है। 'मुख्य' में कोड सही है। उस लाइन पर टिप्पणी करने का प्रयास करें और देखें कि क्या आपको अभी भी दुर्घटना हो रही है या नहीं। – john

+1

मैंने अभी आपके 'मुख्य() 'की प्रतिलिपि बनाई है और इसे यहां चलाया है (उबंटू 12.04, जीसीसी 4.6.3)। अभी तक कोई समस्या नहीं है। त्रुटि कहीं और होनी चाहिए। –

+0

कौन सा लाइन 2 9 है? –

उत्तर

3

समस्या हल हो गई।

सोचा था कि मैं इसे यहां मौके पर जोड़ दूंगा, किसी और ने कभी भी वही काम किया है।

मैंने धीरे-धीरे अपमानजनक फ़ाइल को खोजने और खोजने के लिए अपनी परियोजना में फ़ाइलों को हटा दिया। मैं सोच रहा था कि यह एक हेडर फ़ाइल में परिभाषित कुछ होना चाहिए जो मुद्दों को उत्पन्न कर रहा था (एक स्थैतिक की तरह)। इसमें काफी समय लगा लेकिन मुझे लगता है कि मैंने इसे पाया है। मेरे पास एक हेडर फ़ाइल थी जो कई structs को परिभाषित करती है। इन्हें तार के लिए क्रमबद्ध किया गया है, इसलिए मैंने उन्हें #pragma पैक (पुश) का उपयोग करके 1 बाइट गठबंधन किया था जिसे मैंने फ़ाइल के शीर्ष पर रखा था और नीचे #pragma पैक (पॉप) रखा था। लेकिन फिर मैंने पहली #pragma परिभाषा के बाद कुछ # अंतर्निहित बयान जोड़े, जिसका अर्थ है कि इनमें गलत तरीके से गठबंधन किया गया था और कुछ नोडेटर्मेनिस्टिक व्यवहार का कारण बन गया था। धन्यवाद हर कोई जो एक नज़र था। शायद विशेषता वाक्यविन्यास का उपयोग करना चाहिए और मुझे समस्या नहीं होगी। पूर्ण कोड के लिए अपमान कोड नीचे है।

#pragma pack (push) 
#pragma pack (1) 

#include <string> //Wrong place for includes! 
#include <Units.h> 

typedef struct 
{ 
.... 
} 
#pragma pack (pop) 

प्रारंभिक समस्या को देखने वाले सभी लोगों के लिए धन्यवाद।

+1

उपयोगकर्ता 1787720, उत्तर के रूप में अपने उत्तर को चिह्नित करें। :) – Yakk

+0

एक समान प्रभाव भी '#pragma पैक (पॉप) भूल के कारण हो सकता' –

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