2009-04-04 16 views
8

मुझे लगता है कि हम सभी स्मृति हटाने के लिए गतिशील रूप से आवंटित सूचक को पुन: असाइन करते समय हटाए जाने की आवश्यकता को समझते हैं। हालांकि, मैं उत्सुक हूं, सी ++ किस हद तक हटाने का उपयोग जरूरी है? उदाहरण के लिए, निम्नलिखित कार्यक्रमहमेशा नए द्वारा हटाया जाना चाहिए?

int main() 
{ 
    int* arr = new int[5]; 
    return 0; 
} 

जबकि सभी इरादों और मकसदों के लिए कोई रिसाव यहां होता है (अपने कार्यक्रम समाप्त हो रहा है और एक बार यह रिटर्न ओएस सभी स्मृति को साफ करेंगे के बाद से) ले, लेकिन मानक अभी भी आवश्यकता होती है - - या सिफारिश करें - इस मामले में हटाने [] का उपयोग? यदि नहीं, तो क्या कोई अन्य कारण होगा कि आप यहां [] क्यों हटा देंगे?

उत्तर

10

कुछ भी नहीं है कि आवश्यकता नहीं है एक को नष्ट [] मानक में - हालांकि, मैं कहूंगा कि यह एक बहुत अच्छा दिशानिर्देश का पालन है।

हालांकि, प्रत्येक नए या नए [] ऑपरेशन के साथ हटाएं या हटाएं [] का उपयोग करना बेहतर अभ्यास है, भले ही स्मृति प्रोग्राम समाप्त होने से साफ हो जाए।

कई कस्टम ऑब्जेक्ट्स में एक विनाशक होगा जो स्मृति को साफ करने के अलावा अन्य तर्क करता है। हटाने का उपयोग इन मामलों में विनाश की गारंटी देता है।

इसके अलावा, यदि आप कभी भी अपने दिनचर्या के चारों ओर घूमते हैं, तो आपके कोड में अन्य स्थानों में मेमोरी लीक होने की संभावना कम होती है।

0

आप चीजों को हटाने के लिए भूलने के लिए पूरी तरह से स्वतंत्र हैं।

क्या आपको स्मृति बर्बाद करना पसंद है?

1

यहां नहीं। लेकिन चूंकि कार्यक्रम बड़ा और अधिक जटिल हो जाता है, इसलिए मैं अपनी याददाश्त का प्रबंधन करूंगा ताकि मैं तेजी से बग को ट्रैक कर सकूं। मानक कुछ भी नहीं कहता है लेकिन छोटे मामले में अच्छी आदतें पाने से बेहतर कोड लंबी अवधि तक पहुंच जाता है।

+0

दरअसल, मेरा मतलब है कि मैं खुद को अक्सर वापस लौटने से पहले [] बयान हटा देता हूं, भले ही मुझे पता था (व्यावहारिक स्तर पर) कि इससे कोई फर्क नहीं पड़ता। और यह ऐसी आदत नहीं है जिसे मैं रोकने के लिए देख रहा हूं - मुझे बस इतना हद तक दिलचस्पी थी कि मानक ने इसकी सिफारिश की थी। – GRB

0

मैं स्टैंडर्ड पता नहीं है, लेकिन वहाँ इस सवाल के चारों ओर एक पूरे प्रोग्रामिंग शैली है: crash-only softxare सैद्धांतिक रूप से डेटाबेस या ओएस कर्नेल जैसे विकसित किया जाना चाहिए, लेकिन अक्सर यह नहीं वास्तव में उन्हें कि पुनः आरंभ क्योंकि पर की तरह उपयोग करने के लिए व्यावहारिक है कुछ सफाई है जो लंबे समय तक हो सकती है। इसके अलावा आश्रित सिस्टम (ओएस या डेटाबेस क्लाइंट के अंदर प्रोग्राम) केवल क्रैश नहीं हो सकते हैं।

7

की Is there a reason to call delete in C++ when a program is exiting anyway?

उत्तर शिकार कि विनाशकर्ता चलाने करने की आवश्यकता है, क्योंकि यह कार्यक्रम बाहर निकलने से पहले वस्तु को हटाने के लिए कभी कभी आवश्यक है। इसके अलावा, यदि आप ऐसा नहीं करते हैं, तो कई मेमोरी लीक डिटेक्शन टूल शिकायत करेंगे, इसलिए वास्तविक मेमोरी लीक ढूंढना आसान बनाने के लिए, आपको बाहर निकलने से पहले अपनी सभी ऑब्जेक्ट्स को आजमाएं और हटा दें।

+0

मुझे वह याद आया! :) –

+0

हां, यह वास्तव में खोजने के लिए मुश्किल था; आपने मुझे पद पर हराया क्योंकि मैंने उस लेख को खोजने के लिए समय निकाला था, क्योंकि मुझे पता था कि पिछले कुछ दिनों में यह पूछा गया था। –

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

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