यह एक स्मृति आवंटन मुद्दा है जिसे मैंने वास्तव में कभी नहीं समझा है।संदर्भ द्वारा पारित करने का अच्छा विचार कब नहीं है?
void unleashMonkeyFish() { MonkeyFish * monkey_fish = new MonkeyFish(); std::string localname = "Wanda"; monkey_fish->setName(localname); monkey_fish->go(); }
उपरोक्त कोड में, मैं ढेर पर एक MonkeyFish वस्तु बना लिया है, यह एक नाम सौंपा है, और फिर दुनिया पर यह फैलाया। आइए मान लें कि आवंटित स्मृति का स्वामित्व बंदरफिश ऑब्जेक्ट में ही स्थानांतरित कर दिया गया है - और केवल बंदरफिश ही तय करेगा कि मरने और खुद को हटाने के लिए क्या होगा।
अब, जब मैं MonkeyFish वर्ग के अंदर "नाम" डेटा सदस्य परिभाषित करते हैं, मैं निम्न में से एक चुन सकते हैं:
std::string name; std::string & name;
जब मैं MonkeyFish वर्ग के अंदर setName() फ़ंक्शन के लिए प्रोटोटाइप को परिभाषित , मैं निम्नलिखित में से एक चुन सकता हूं:
void setName(const std::string & parameter_name); void setName(const std::string parameter_name);
मैं स्ट्रिंग प्रतियों को कम करने में सक्षम होना चाहता हूं। असल में, अगर मैं कर सकता हूं तो मैं उन्हें पूरी तरह खत्म करना चाहता हूं। तो, ऐसा लगता है कि मुझे संदर्भ द्वारा पैरामीटर पास करना चाहिए ... सही?
मुझे क्या बग है कि ऐसा लगता है कि मेरा स्थानीय नाम परिवर्तक अनलैशमोनकीफिश() फ़ंक्शन पूरा होने के बाद गुंजाइश से बाहर जा रहा है। क्या इसका मतलब है कि मुझे कॉपी द्वारा पैरामीटर पास करने के लिए मजबूर किया गया है? या मैं इसे संदर्भ से पास कर सकता हूं और किसी भी तरह से "इससे दूर हो सकता हूं"?
असल में, मैं इन स्थितियों से बचना चाहते हैं:
- मैं केवल localname स्ट्रिंग के लिए स्मृति के लिए दूर जाना जब unleashMonkeyFish() फ़ंक्शन समाप्त हो जाता है MonkeyFish का नाम स्थापित करने के लिए, नहीं करना चाहती। (ऐसा लगता है कि यह बहुत खराब होगा।)
- यदि मैं इसकी सहायता कर सकता हूं तो मैं स्ट्रिंग की प्रतिलिपि बनाना नहीं चाहता हूं।
- मैं नए localname
मैं क्या प्रोटोटाइप और डेटा सदस्य संयोजन का उपयोग करना चाहिए के लिए नहीं पसंद करेंगे?
वर्गीकरण: कई उत्तरों ने स्थिर कीवर्ड का उपयोग करने का सुझाव दिया ताकि यह सुनिश्चित किया जा सके कि स्मृति को स्वचालित रूप से डी-आवंटित नहीं किया जाता है जब UnleashMonkeyFish() समाप्त होता है। चूंकि इस एप्लिकेशन का अंतिम लक्ष्य एन बंदरफिश को उजागर करना है (जिनमें से सभी के पास अद्वितीय नाम होना चाहिए) यह एक व्यवहार्य विकल्प नहीं है। (और हाँ, MonkeyFish - जा रहा है चंचल जीव - अक्सर उनके नाम, कुछ समय में कई बार एक ही दिन में बदल जाते हैं।)
संपादित: ग्रेग Hewgil ने कहा है कि यह एक संदर्भ के रूप में नाम चर स्टोर करने के लिए अवैध है, चूंकि इसे कन्स्ट्रक्टर में सेट नहीं किया जा रहा है। मैं इस सवाल में गलती छोड़ रहा हूं, क्योंकि मुझे लगता है कि मेरी गलती (और ग्रेग का सुधार) पहली बार इस समस्या को देखने वाले किसी के लिए उपयोगी हो सकता है।
क्या आपने प्रोफाइल किया है और यह निर्धारित किया है कि यह एक समस्या है? – CTT
@ सीटीटी - नहीं, मैंने नहीं किया है। हालांकि, अगर मैं इससे बच सकता हूं तो स्ट्रिंग की प्रतिलिपि बनाने में अक्षम लगता है। आम तौर पर, मैं जितना संभव हो कॉपी करने से बचना चाहता हूं। – Runcible
"monkey_fish" ढेर पर है, ढेर नहीं। –