2015-02-07 5 views
5

के बाद एक सूचक का पुन: उपयोग करना क्या यह निम्नलिखित के रूप में कुछ करने के लिए सुरक्षित और/या अच्छा अभ्यास है?'हटाएं'

//NewList is a member function of a class 
void NewList(int size){ 

delete[] list; //list is a member variable; an already initialized dynamic array. 

list=new ListObject[size]; 

} 

मैं मूल रूप से पिछले सरणी को त्यागकर रहा हूँ क्योंकि मैं कक्षा में स्टोर करने के लिए अलग-अलग डेटा का उपयोग करेगा, और इसलिए नए डेटा पर अन्य जानकारी स्टोर करने के लिए एक नया list आवश्यकता होती है। यदि यह अच्छा अभ्यास नहीं है, तो विकल्प क्या है?

+2

** 'वेक्टर' ** का उपयोग करें **। –

+0

क्या आपने [नियम का तीन] पढ़ा था (https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? नई मेमोरी में पॉइंटर असाइन करना कानूनी है, भले ही यह ** सुरक्षित ** शेष कोड पर निर्भर करता है। –

+0

"क्या यह निम्नलिखित के रूप में कुछ करने के लिए सुरक्षित और/या अच्छा अभ्यास है?" हाँ, यह सुरक्षित है। चाहे यह अच्छा है, राय के अधीन है। –

उत्तर

3

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

यदि संभव हो तो मैं मेमोरी लीक बना सकता हूं, यदि आप उचित रूप से हटाए गए हैं तो मैं इससे बचूंगा।

2

हां, पिछली मेमोरी को हटाने के बाद एक नया मेमोरी पता स्टोर करने के लिए पॉइंटर का पुन: उपयोग करना पूरी तरह से ठीक है।

बस सावधान रहें कि पुरानी मेमोरी पता को पूर्ववत न करें जो अभी भी सूचक में संग्रहीत है। आपके कोड स्निपेट में हालांकि कोई समस्या नहीं है।

एक साइड नोट के रूप में, अधिकांश समय, आपको std::vector का उपयोग करना चाहिए यदि आप गतिशील रूप से आवंटित सरणी चाहते हैं, जैसा टिप्पणियों में उल्लिखित है।

1

आप जो कर रहे हैं उसके साथ स्वाभाविक रूप से गलत कुछ भी नहीं है। हालांकि, यदि यह कक्षा का सदस्य कार्य है, और list एक सदस्य चर है, तो ध्यान रखें कि आपके पास कोड अपवाद सुरक्षित नहीं है।

दूसरे शब्दों में, यदि new[] पर कॉल किसी कारण से विफल रहता है, तो आपकी list सरणी नष्ट हो गई है, और आप डेटा पुनर्प्राप्त नहीं कर सकते हैं।

बेहतर यह करने के लिए:

void NewList(int size) 
{ 
    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp; 
} 

new[] करने के लिए कॉल एक अपवाद फेंकता है, तो आप अपने मूल डेटा को नष्ट कर दिया नहीं किया है।

हालांकि, अगर आप std::vector का उपयोग करते हैं, तो इन सभी को ध्यान में रखा जाता है, जैसा कि अन्य ने सुझाव दिया है।

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