C++ Boost any attempt -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 2 जवाब
मेरे पास पहुंच नहीं है बूस्ट लाइब्रेरी के लिए और किसी भी बूस्ट (एक कंटेनर जो कई प्रकार के स्टोर कर सकता है) के समान कुछ लागू करने की कोशिश कर रहा है मुझे एक उदाहरण मिला, लेकिन जब मैं इसे संकलित करता हूं तो मुझे विभाजन की गलती मिलती है इसे डिबग करने से यह सुझाव मिलता है कि यह भिन्नता के नाशक के कारण एक समस्या है। जब मैं डिस्ट्रक्टर पर टिप्पणी करता हूं तो यह ठीक काम करता है - हालांकि यह स्मृति लीक है क्या कोई ये समझा सकता है कि क्या हो रहा है? धन्यवाद!
<पूर्व> #include & lt; iostream & gt; #include & lt; vector & gt; नेमस्पेस एसटीडी का उपयोग करना; कक्षा बेसहॉल्डर {सार्वजनिक: वर्चुअल ~ बेसहोल्डर () {}}; टेम्पलेट & lt; typename T & gt; वर्ग होल्डडाटा: सार्वजनिक बेसहोल्डर {सार्वजनिक: होल्डडाटा (कॉन्स्ट टी एंड टी_): टी (टी _) {} टी टी; }; क्लास संस्करण {सार्वजनिक: टेम्पलेट & lt; typename T & gt; वेरिएंट (कॉन्स्ट टी एंड टी): डेटा (नया होल्डडाटा & lt; T & gt; (टी)) {} ~ वेरिएंट () {डेटा हटाएं;} बेसहॉल्डर * डेटा; }; Int main () {वेक्टर & lt; variant & gt; ए; Int x = 10; डबल y = 3.15; a.push_back (x); a.push_back (y); Cout & lt; & lt; dynamic_cast & LT; HoldData & LT; पूर्णांक & gt; * & Gt; (एक [0] .डेटा) - & gt; टी & lt; & lt; endl; Cout & lt; & lt; dynamic_cast & LT; HoldData & LT; डबल & gt; * & Gt; (एक [1] .डेटा) - & gt; टी & lt; & lt; endl; वापसी 0; }
आउटपुट:
10 3.5
मुझे क्या लगता है कि यह हो रहा है
-
आप सदिश पर एट 10 को दबाएं
-
यह एक अस्थायी संस्करण के लिए कन्स्ट्रक्टर कॉल को चालू करता है इस var1 को कॉल करता है।
-
कन्स्ट्रक्टर कॉल होल्डडेटा (10)
-
अब वेक्टर वेक्टर की प्रतिलिपि कन्स्ट्रक्टर (जो स्वचालित रूप से संकलक द्वारा प्रदान की जाती है) को वैक्टर में एक var2 बनाने के लिए कहता है। डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर सिर्फ एक बिट की प्रतिलिपि है, इसलिए var1 और var2 दोनों में डेटा पॉइंटर है जो एक ही स्थान पर इंगित करता है।
-
var1 अब गुंजाइश से बाहर निकलता है और इसके डिस्ट्रक्टर को इसे हटाना कहा जाता है डेटा पॉइंटर।
-
वेक्टर में var2 में अब अमान्य मेमोरी के लिए एक सूचक है जब वेक्टर एक दायरे से बाहर हो जाता है तो var2 अपने डिस्ट्रिक्टर को कॉल करेगा और दुर्घटना के कारण दूसरी बार स्मृति को हटाने की कोशिश करेगी।
आपको अपनी खुद की कॉपी कन्स्ट्रक्टर को वेरिएंट जो होल्डडाटा पॉइंटर की सुरक्षित रूप से प्रतिलिपि करेंगे।
Comments
Post a Comment