मैं सी ++ के तारों के साथ काफी नौसिखिया हूं इसलिए निम्न पैटर्न थोड़ा भाग्यशाली हो सकता है। मैं एक बड़े सिस्टम के साथ एकीकरण परीक्षण शुरू करने से पहले मैंने लिखा कुछ कोड की समीक्षा कर रहा हूं। मैं क्या जानना चाहता हूं कि यह सुरक्षित है, या यदि यह स्मृति को लीक करने के लिए प्रवण होगा?एक सी ++ std :: स्ट्रिंग ऑब्जेक्ट को स्मृति रिसाव से सुरक्षित कर रहा है?
string somefunc(void) {
string returnString;
returnString.assign("A string");
return returnString;
}
void anotherfunc(void) {
string myString;
myString.assign(somefunc());
// ...
return;
}
समझ रहा है कि returnString का मूल्य एक नई वस्तु myString को सौंपा गया है और उसके बाद returnString वस्तु कॉल somefunc को हल करने के भाग के रूप को नष्ट कर दिया जाता है। भविष्य में किसी बिंदु पर जब MyString गुंजाइश से बाहर हो जाता है, तो यह भी नष्ट हो जाता है।
मैं आमतौर पर myString() में myString के लिए एक पॉइंटर पास कर देता था और सीधे MyString के मानों को सौंपा गया था, लेकिन मैं अपने कोड में थोड़ा स्पष्ट होने का प्रयास कर रहा हूं (और साइड इफेक्ट फ़ंक्शन शैली पर निर्भर करता हूं)।
पहले फ़ंक्शन में, आप शायद "वापसी स्ट्रिंग (" एक स्ट्रिंग ") कर सकते हैं;" और एक ही परिणाम है। – luiscubal
@luiscubal यह समस्या को स्पष्ट करने के लिए एक सरलीकृत उदाहरण है। – Stephen
@luiscubal भी 'वापसी' एक स्ट्रिंग "; 'ठीक है क्योंकि std :: स्ट्रिंग सी तारों के साथ रचनात्मक है। – log0