मेरे पास एक वर्ग है जो std :: forward_list का उपयोग इस प्रकार है:
void Foo: : ऐडबार (बार * _bar) {Bars.push_front (_bar); } शून्य Foo :: DeleteBar (बार * _bar) {for (forward_list :: iterator index = Bars.begin (); index! = Bars.end (); ++ अनुक्रमणिका) {if (_bar == * सूचकांक} {delete _bar; forward_list.remove (_bar); }}} अगर मैं एक स्टैक आवंटित वैरिएबल पास करता हूं, तो डीबग / रिलीज़ में मुझे एक रनटाइम त्रुटि देगी, उत्पादन में यह ढेर को "मैंगल" करेगा।
बार बार; foo.AddBar (& amp; बार); foo.DeleteBar (& amp; बार); // मेमोरी भ्रष्टाचार "हटाएँ _बार" मैं फू :: एबब्रर को स्टैक आवंटित डेटा को स्वीकार करने से कैसे रोक सकता हूं? क्या यह डिजाइन करने का एक बेहतर तरीका है?
संपादित करें 6/21/13 इसमें को हटा दें _bar; और forward_list.remove (_bar); फ़ॉर लूप के अंदर, एक रनटाइम त्रुटि का कारण बनता है, जब इटरेटर की बढ़ोतरी हो। मैंने फ़ू में पूरी तरह से स्वामित्व नियंत्रण रखने का विकल्प चुना है ऐसा टेम्पलेट:
टेम्पलेट & lt; class T & gt; टी * एडबार () {बार * वस्तु = नया टी (); Bars.push_front (वस्तु); वापसी वस्तु; } // उपयोग की तरह दिखता है ... प्रक्रिया * pid = foo.AddBar & lt; MyBar & gt; (); // बार का एक उप-वर्ग जोड़ना मैं तलाशने के प्रयोजनों के लिए पीआईडी के रूप में सूचक का उपयोग कर रहा हूं I मैं इसे int वापस पहले कभी भी बिना इसे हटाएं आईएनजी को रोकने के लिए भेज सकता था। ओह, और तर्क के लिए मैं ऐडबार (शून्य * तर्क)
सीधे शब्दों में कहें, आप नहीं कर सकते पॉइंटर एक सूचक है आपको उनसे पहली जगह से बचना चाहिए यदि आपने उनका उपयोग करने का निर्णय लिया है, तो दस्तावेज़ीकरण की नीति बनाएं और इसके लिए कोड को ठीक से देख लें।
आपके उदाहरण में स्वामित्व का हस्तांतरण होता है (या कम से कम कुछ ऐसी चीज़ जो डिजाइन का हिस्सा भी बदबू आती है), आपको यह दस्तावेज देना चाहिए। फ़ंक्शन को केवल ऑब्जेक्ट के साथ बुलाया जाना चाहिए जो निश्चित तरीके से बनाया जाता है। & Amp; बार उस पर भरोसा करते हुए समीक्षा पर पकड़ा जाना चाहिए।
No comments:
Post a Comment