memory management - C++ passing struct or object by value -
मेरे पास यह है:
enum इकाइयों {पाउंड्स, किलॉस}; संरचना विन्यास (const इकाइयों इकाइयों); Const char * नाम; इनलाइन कॉन्फ़िगरेशन (यूनिट्स पीयूनेट्स, चार * पी एननाम): यूनिट्स (पीआईएनआईटीएस) {name = strdup (pName); } इनलाइन ~ कॉन्फ़िगरेशन () {निशुल्क ((शून्य *) नाम); }};
मैं इनमें से किसी एक को इस तरह से चला रहा था:
कॉन्फ़िगरेशन सीसी (किलॉस, "एबीसी"); cdao- & gt; बारे में (सीसी);
मुझे इस से बुरा क्रैश हो रहा था जब तक कि कोई संदर्भ लेने के लिए मैंने विधि को रीडिफाईंग करने की कोशिश की:
कॉन्फ़िगरेशन सीसी (किलॉस, "एबीसी"); cdao- & gt; बारे में (& amp; सीसी);
और अब सबकुछ काम करता है।
लेकिन मूल्य द्वारा स्ट्रैट मेमोरी के साथ कैसे पेंच हो सकता है?
आपने अपना स्वयं का कॉपी कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर प्रदान नहीं किया है। इसलिए, जब आप प्रतिलिपि या एक असाइनमेंट करते हैं, तो संकलक-जनरेट किए गए प्रतिलिपि कन्स्ट्रक्टर और असाइनमेंट ऑपरेटरों का उपयोग किया जाता है, जो वास्तव में इस मामले में सही काम नहीं करते हैं। वे प्रत्येक सदस्य की प्रतिलिपि बनाते हैं, ताकि आप उसी चरित्र सरणी के संदर्भ में दो कॉन्फ़िगरेशन ऑब्जेक्ट्स के साथ समाप्त हो जाएं। और दोनों कॉन्फ़िगरेशन ऑब्जेक्ट्स सरणी को हटाने के लिए ज़िम्मेदार महसूस करती हैं जो लगभग निश्चित तौर पर "डबल-डिलीशन" त्रुटि की ओर जाता है।
"" ध्यान में रखें। यहाँ समस्या यह है कि सूचक ऐसा व्यवहार नहीं करता जैसा आप करना चाहते हैं। यदि आपने सदस्य के रूप में एक std :: string का इस्तेमाल किया था तो आपको अपने खुद के कॉपी कन्स्ट्रक्टर, डिस्ट्रिक्टर, असाइनमेंट ऑपरेटर लिखना नहीं होगा। ऐसा इसलिए है क्योंकि कंपाइलर-जनित वाले केवल अपने सदस्यों पर प्रासंगिक कार्रवाइयों का आह्वान करते हैं और स्ट्रिंग-सदस्य पहले से ही इसे सही तरीके से संभालता है- चार के लिए एक सूचक के विपरीत।
Comments
Post a Comment