c++ - Error: *** glibc detected *** w5: double free or corruption (fasttop): -


यह मैं जो त्रुटि पा रहा हूं:

  ======= मेमोरी मानचित्र: ======== 08048000-0804a000 r-xp 00000000 00:28 2955225621 / घर / w5 / w5 ... अधिक निरस्त   

मेरा प्रोग्राम सही संकलन करता है, यहां तक ​​कि भाग मेरे उत्पादन का सही है मेरे पास 3 फ़ाइलें हैं, w5.cpp, employee.h, कर्मचारी.cpp। मुझे प्रतिलिपि निर्माता, एक असाइनमेंट ऑपरेटर और एक नाशक बनाने की आवश्यकता है।

w5.cpp (इसकी थोड़ी बड़ी)।

employee.h वर्ग कर्मचारी { <पूर्व> int empNum; Char * empName; सार्वजनिक: // कंस्ट्रक्टर कर्मचारी (); कर्मचारी (पूर्णांक संख्या, const char * नाम); // कॉपी कन्स्ट्रक्टर कर्मचारी (कॉम्प कर्मचारी और स्रोत); // असाइनमेंट ऑपरेटर कर्मचारी & amp; ऑपरेटर = (कॉन्स्ट कर्मचारी और स्रोत); // डिस्ट्रिक्ट ~ कर्मचारी (); शून्य प्रदर्शन () कॉन्स्ट; बूल हैग्रेरथान (कॉन्स्ट कर्मचारी & amp;) कॉन्स्ट; };

कर्मचारी.cpp <पूर्व> #include & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; # शामिल "कर्मचारी एच" # शामिल करें & lt; string.h & gt; कर्मचारी :: कर्मचारी () {empNum = 0; EmpName = nullptr; } कर्मचारी: कर्मचारी (पूर्णांक संख्या, const char * नाम) {यदि (num & lt; 0 || strcmp (नाम, "") == 0) {कर्मचारी (); } और {empNum = num; EmpName = नया चार [स्ट्रेलन (नाम) +1]; Strcpy (empName, नाम); }} कर्मचारी :: कर्मचारी (कर्मचारी और स्रोत) (cout & lt; & lt; "कॉपी कन्स्ट्रक्टर!" & Lt; & lt; endl; अगर (source.empName! = Nullptr) {empNum = source.empNum; EmpName = नया char [strlen (source.empName) +1]; // स्ट्रकपी (empName, source.empName); EmpName = source.empName; } और empName = nullptr; } कर्मचारी & amp; कर्मचारी :: ऑपरेटर = (कॉन्स्ट कर्मचारी और स्रोत) {cout & lt; & lt; "ऑपरेटर असाइनमेंट!" & Lt; & lt; endl; // आत्म-नियुक्ति के लिए जांच करें यदि (यह! = & Amp; स्रोत) {cout & lt; & lt; "ऑपरेटर असाइनमेंट 2" & lt; & lt; endl; EmpNum = source.empNum; हटाएं [] empName; अगर (source.empName! = Nullptr) {empName = source.empName; // स्ट्रकपी (empName, source.empName); } और empName = nullptr; } वापसी * ​​यह; } // डिस्ट्रिक्ट कर्मचारी :: ~ कर्मचारी () {हटाएं] empName; } शून्य कर्मचारी :: प्रदर्शन () const {cout & lt; & lt; EmpNum & lt; & lt; EmpName & lt; & lt; endl; } Bool कर्मचारी :: isGreaterThan (const कर्मचारी और स्रोत) const {वापस सच; // अभी भी कोड की जरूरत है}

इसे संकलित करने के लिए मैं g ++ -std = c ++ 0x -o w5 w5.cpp Employee.cpp का उपयोग करने के बाद इस समस्या से संबंधित ऑनलाइन मुझे लगता है कि मेरे पास "गैर वैध सूचक" है, लेकिन मुझे यकीन नहीं है कि कहां है।

मैं देख रहा हूं कि एक समस्या आपके असाइनमेंट ऑपरेटर में है:

  // इन दो पंक्तियों को empNum = source.empNum हटा दिया जाना चाहिए; हटाएं [] empName; // यह स्रोत के कर्मचारी का नाम हटाता है! (खराब) अगर (source.empName! = Nullptr) {empName = source.empName; }   

आपको अपने ऑब्जेक्ट के empName पॉइंटर को source के द्वारा source इस स्मृति को नष्ट कर देगा जब नाशक कहा जाता है। आपको स्ट्रिंग के लिए नई मेमोरी आवंटित करनी चाहिए और फिर उसमें प्रतिलिपि बनाएं:

  // पहले हमारी स्ट्रिंग हटाएं अगर हम पहले इसके लिए स्मृति आवंटित कर चुके हैं (empName! = Nullptr) {delete] empName; EmpName = nullptr; } // अब स्रोत के empName की प्रतिलिपि बनाएं अगर (source.empName! = Nullptr) {empName = new char [strlen (source.empName) +1]; Strcpy (empName, source.empName); }    

Comments

Popular posts from this blog

sql - Return Function using Cursor -

javascript - Is there any way to add a new parameter to a function programmatically? -

sql server - How to use pivot in this table -