Error returning a list of user-defined objects from a function in C++ -
पृष्ठभूमि
मैंने एक वर्ग Str उस निर्देश के उद्देश्यों के लिए स्ट्रिंग ऑपरेशन की नकल करता है वर्ग
Str
सार में वर्णों की एक सरणी है।
मैंने एक फ़ंक्शन makeList
बनाया है जो एक Str
ऑब्जेक्ट प्राप्त करता है, Str
वस्तुओं का push_back
का उपयोग करके एक सूची बनाता है और सूची लौटाता है।
मैं आबंटक
का उपयोग कर रहा हूं, लेकिन मैंने कड़ा कर दिया है मेमोरी प्रबंधन को बनाए गए पात्रों के लिए पर्याप्त मेमोरी आवंटित करना।
समस्या
-
संकलन, लिंक और रन-टाइम कोई त्रुटि उत्पन्न नहीं करता।
-
-
समस्या यह है कि सूची में ऑब्जेक्ट में कचरा इनपुट पहले ~ 10 वर्णों को अधिलेखित करते हैं, जब
मुख्य में देखे जाते हैं
body। -
मैंने यह भी सत्यापित किया है कि
Str
मैं बना रहा हूँ डिफ़ॉल्ट डिस्ट्रक्टर के माध्यम से नष्ट हो रहा है।
मैंने समस्या को दोहराने के लिए कोड की न्यूनतम राशि शामिल की है।
गैर-वर्ग कोड:
सूची से & lt; Str & gt; मेनलिस्ट (कॉन्स्ट स्ट्रल्स) {सूची & lt; str & gt; सेवानिवृत्त; ret.push_back (रों); Cout & lt; & lt; Ret.back () & lt; & lt; endl; रिटर्न रिट; } Int main () {Str greet = "हैलो वर्ल्ड"; सूची के & lt; Str & gt; परिणाम; परिणाम = मेनलिस्ट (ग्रीटिंग); result.pop_front (); Cout & lt; & lt; "परिणाम है" & lt; & lt; परिणाम.फ्रंट () & lt; & lt; endl; वापसी 0; }
कक्षा कोड:
वर्ग str {friend std :: istream & amp; ऑपरेटर & gt; & gt; (इस्ट्रीम एंड, स्ट्रिंग & amp;); सार्वजनिक: टाइपिंगफेस चार * इटरेटर; टाइप-टोफ कॉन्फ़ चार * कॉन्स्टिटरेटर; Typedef size_t size_type; Typedef char value_type; Str () {बनाएँ (); } // डिफ़ॉल्ट कन्स्ट्रक्टर स्ट्र (const_iterator cp, const_iterator cp2) {बनाने (सीपी, सीपी 2); } Str (const_iterator cp) {बनाएँ (सीपी, सीपी + स्ट्रेलन (सीपी)); } ~ Str () {पैदा करना (); } चार & amp; ऑपरेटर [] (आकार_प्रकार i) {रिटर्न डेटा [i]; } कॉन्स्ट चार & amp; ऑपरेटर [] (size_type i) const {रिटर्न डेटा [i]; } स्ट्रॉ और amp; ऑपरेटर = (सीआरआर & amp; एस) {निर्माण (); बनाओ (एस.बीजिन (), एस.एंड ()); }; स्ट्रॉ सबस्ट्रैट (आकार_प्रकार I, आकार_प्रकार डी) कॉन्स्ट {कंटिइटरेटर सीस्टार्ट, सीटीआरएम; CStart = this- & gt; शुरू () + i; सीटीआरएम = यह- & gt; शुरू () + आई + डी; स्ट्रिंग उप (सीस्टार्ट, सीटीआरएम); Cout & lt; & lt; "पॉइन्टर फ़ेफ =" & lt; & lt; उप.लिमिट - सबडेटा & lt; & lt; endl; वापसी उप; } Size_type आकार () const {वापसी लाभ - डेटा; } इटरेटर शुरू () {रिटर्न डेटा; } Const_iterator शुरू () const {रिटर्न डेटा; } इटरेटर एंड () {वापसी लाभ; } Const_iterator अंत () const {रिटर्न लाभ; } निजी: आईटरेटर डेटा; इटरेटर लाभ; इटरेटर सीमा; संभाजक & LT; चार & gt; alloc; शून्य बनाएँ (); शून्य बनाने (const_iterator, const_iterator); शून्य का निर्माण (); }; शून्य स्ट्रॉ :: बनाने () {data = avail = limit = 0; } शून्य स्ट्रा :: बना (const_iterator i, const_iterator j) {data = alloc.allocate (j - i); सीमा = लाभ = uninitialized_copy (i, j, डेटा); } Void Str :: evcreate () {if (डेटा) {iterator = avail; जबकि (यह! = डेटा) alloc.destroy (- यह); Alloc.deallocate (डेटा, सीमा - डेटा); } डेटा = सीमा = लाभ = 0; Cout & lt; & lt; "असंगत" & lt; & lt; endl; } ओस्ट्रीम एंड amp; ऑपरेटर & lt; & lt; (ostream & amp; os, const str & amp; s) {के लिए (str :: size_type i = 0; i! = S.size (); i ++) ओएस & lt; & lt; रों [i]; वापसी ओएस; }
अन्य बातों के अलावा, आप और यहां: इसके बिना, डिफॉल्ट प्रतिलिपि कन्स्ट्रक्टर का उपयोग किया जाता है, लेकिन यह जो आप चाहते हैं वह नहीं कर रहा है। संभावित कार्यान्वयन: हमेशा सम्मान करें Str < / कोड>, लेकिन आप इसे यहां कॉल करते हैं:
result2 = makeList (ग्रीटिंग); // पास से मूल्य - & gt; कॉपी
ret.push_back (s); // पास से मूल्य - & gt; कॉपी
Str (const str और अन्य) {बना (अन्य। बीजीआईएन (), अन्य। अंत ()); }
Comments
Post a Comment