2008-12-13 31 views

उत्तर

18

का आग्रह कर रहे हैं यही कारण है कि सी ++ कक्षाएं विनाशकर्ता है, कुछ कक्षाएं सिर्फ स्मृति को मुक्त कराने के अलावा अन्य आवश्यकताओं है। आपके पास ऐसी ऑब्जेक्ट हो सकती है जो सॉकेट कनेक्शन आवंटित की जाती है जिसे उदाहरण के लिए साफ से बंद करने की आवश्यकता होती है।

इसके अलावा, 'अनकॉपिंग' एक पॉइंटर उस स्मृति को मुक्त करता है जो अन्य बिंदुओं के संदर्भ में इंगित करता है।

यदि आपके पास स्टैक पर पॉइंटर है, तो फ़ंक्शन से बाहर निकलने से पॉइंटर द्वारा उपयोग की जाने वाली मेमोरी मुक्त हो जाएगी लेकिन नहीं है जो कि पॉइंटर द्वारा इंगित किया गया है। एक सूक्ष्म लेकिन बहुत महत्वपूर्ण भेद है।

14

जब कोई पॉइंटर गुंजाइश से बाहर हो जाता है, तो द्वारा ली गई मेमोरी पॉइंटर जारी की जाती है। पॉइंटर द्वारा लिया गया स्मृति की 4 या 8 बाइट्स (आमतौर पर)।

वस्तु (या अन्य स्मृति) है कि सूचक अंक जारी नहीं जब सूचक क्षेत्र से बाहर चला जाता है के लिए। आप द्वारा को पॉइंटर में हटाते हैं। और अगर कोई है तो विनाशक का आह्वान करता है।

0

(वर्ग के सदस्य के रूप में मौजूद हैं) कभी वहाँ एक सूचक है, वहाँ उस वर्ग है कि वस्तु सूचक सदस्य द्वारा बताया हटा देना चाहिए के लिए एक नाशक होना चाहिए। आप कक्षा में सूचक के स्थान पर smart_pointer है तो वहाँ नाशक की कोई जरूरत नहीं है।

qn नीचे

में मदद मिलेगी यू बेहतर समझते हैं। Will the below code cause memory leak in c++

9

सबसे पहले, आप गलती से राज्य है कि स्मृति जब सूचक दायरे से बाहर चला जाता है मुक्त हो जाता है। कच्चे पॉइंटर्स जो झूठे हैं, स्मृति खो जाती है, और इसके साथ बिंदु वस्तु द्वारा आयोजित कोई भी संसाधन।

Destructors भाषा की मूल विशेषता, और संसाधन प्रबंधन के लिए RAII मुहावरा के लिए आधार हैं। ऑब्जेक्ट्स निर्माण के दौरान संसाधन प्राप्त करते हैं और विनाशक में वही संसाधन जारी करते हैं। यह संसाधन प्रबंधन के लिए एक सरल, नियंत्रित और सरल दृष्टिकोण है। यहाँ ध्यान दें कि संसाधन स्मृति से कुछ भी है या किसी अन्य संसाधन (ofstreams डेटाबेस कनेक्शन सॉकेट मुक्त खुली फ़ाइलों जारी,) (स्मार्ट संकेत विनाशकर्ता स्मृति वे नियंत्रित मुक्त, कंटेनर उनके आंतरिक स्मृति संरचना मुक्त)।

प्रबंधित भाषाओं के साथ सी # या जावा मेमोरी स्वचालित रूप से कचरा कलेक्टर द्वारा जारी की जाती है, यह केवल स्मृति है जिसे पुनः प्राप्त किया जाता है, और उपयोगकर्ता को उपयोग के स्थान पर मैन्युअल रूप से अन्य सभी संसाधनों को नियंत्रित करने का तनाव होता है।

आप सी #/जावा में अपवाद नियंत्रण संरचनाओं की जांच यदि आप सी में एक अंत में खंड न के बराबर है कि वहाँ ++ देखेंगे। इसका कारण यह है कि प्रबंधित भाषाओं को उपयोगकर्ता को कोड के ब्लॉक के साथ प्रदान करना होगा जो संसाधनों को मैन्युअल रूप से मुक्त करने के लिए निष्पादित होने की गारंटी है। संसाधनों को जारी करने का तनाव प्रोग्रामर में रखा गया है जो पुस्तकालयों का उपयोग करता है।

सी ++ में, आरए II मुहावरा का उपयोग कर, प्रत्येक वस्तु संसाधन यह कर रहा है के लिए जिम्मेदार है और विनाश के दौरान उन्हें जारी करना होगा। इसका तात्पर्य है कि यदि आप स्टैक संसाधनों में ऑब्जेक्ट्स का उपयोग कर रहे हैं तो उपयोगकर्ता के इंटरैक्शन के बिना जारी किया जाएगा। संसाधनों को नियंत्रित करने के लिए जिम्मेदारी कक्षा में है, और उपयोगकर्ता को अपने प्रत्येक संसाधन मुक्त करने के लिए याद नहीं करना चाहिए।

कई प्रबंधित भाषा प्रतिवादी खुशी से कहते हैं कि स्मृति याद करने के लिए कब या कहां याद किया जाना चाहिए क्योंकि कचरा कलेक्टर द्वारा दावा किया जाएगा कि यह एक बड़ा फायदा है, लेकिन वे इस बात पर चर्चा नहीं करेंगे कि अन्य संसाधनों को कैसे नियंत्रित किया जाता है । मेमोरी प्रबंधन संसाधन प्रबंधन की समस्या का एक सबसेट है और एक ही समाधान लागू होता है। यदि आप स्मार्ट पॉइंटर्स के अंदर मेमोरी रखते हैं (std :: auto_ptr, boost :: shared_ptr, std :: tr1 :: unique_ptr, std :: tr1 :: shared_ptr ..., अपना उपयोग फिट करने वाला एक चुनें) तो स्मृति प्रबंधित की जाएगी तुम्हारे लिए।

इस पोस्ट विनाशकर्ता के मूल प्रश्न से disgressed है लगता है, यह वास्तव में बहुत निकट से संबंधित है। सभी संसाधन नियंत्रण विनाशकर्ता किया जाना चाहिए, कि कैसे स्मार्ट संकेत दिए गए काम है: जब ढेर स्मार्ट सूचक आवंटित क्षेत्र से बाहर चला जाता है नाशक कहा जाता है और यह जाँच करता है ढेर (नया) आबंटित स्मृति जारी किया जाना चाहिए कि क्या और अगर ऐसा है, हटाना कहा जाता है। लेकिन फिर फिर, यह अधिक सामान्य समस्या का एक सबसेट है।

0

आप अच्छी सी लिख रहे हैं ++ तो आप बहुत कुछ विनाशकर्ता होना चाहिए (वास्तव में मुझे लगता है कि "कुछ विनाशकर्ता" सी ++ कोड गुणवत्ता के लिए एक अच्छा मीट्रिक है)।

अपवादों में से एक जोड़े को मैं के बारे में सोच सकते हैं:

क) आप चीजों को जो खुद को संहार नहीं करते हैं, उदाहरण के लिए साथ काम कर रहे हैं। "फ़ाइल *"।

ख) आप "pimpl" मुहावरा ("pimpl मुहावरा" के लिए गूगल) का उपयोग कर रहे हैं।

एनबी। Std :: auto_ptr और std :: वेक्टर जैसे वर्ग श्रेणी (ए) में आ जाएंगे क्योंकि किसी बिंदु पर उन्हें स्मृति के लिए सी-शैली सूचक की आवश्यकता होती है।

संबंधित मुद्दे