2010-05-03 13 views
5

कहते हैं कि मैं कुछ की तरह है की सुविधा देता है ...सी ++ स्थिर सरणी मेमोरी लीक की ओर अग्रसर है?

void foo() 
{ 
    char c[100]; 
    printf("this function does nothing useful"); 
} 

जब foo कहा जाता है, यह स्टैक पर सरणी बनाता है, और जब यह क्षेत्र से बाहर चला जाता है, स्मृति स्वचालित रूप से पुनः आवंटित की जाती है? या सी नष्ट हो गया है, लेकिन स्मृति आवंटित बनी हुई है, इसे एक्सेस करने का कोई तरीका नहीं है/कंप्यूटर को पुनरारंभ करने के अलावा इसे वापस प्राप्त करें?

+0

यह एक स्थिर सरणी नहीं है। यह सिर्फ एक स्थानीय (स्टैक आवंटित) सरणी है। –

उत्तर

6

स्वचालित रूप से स्मृति को हटा दिया गया है?

हां। और यदि आप सोचते हैं तो विनाशकों को भी बुलाया जाएगा। यही कारण है कि वे automatic storage class में हैं।

(वास्तव में सबसे आर्किटेक्चर के लिए कार्यक्रम केवल कॉल करेंगे कि 100 विनाशकर्ता (यदि हो तो), तो ढेर सूचक पिछड़े 100 * sizeof(T) बाइट्स द्वारा के रूप में "आवंटन रद्द करने" बदलाव।)

+0

ठीक है। उत्तर देने वाले सभी के लिए धन्यवाद। मुझे नए/डिलीट का उपयोग करने के बारे में निश्चित था, लेकिन किसी ने मुझे यह इंप्रेशन दिया था कि मैंने जो पोस्ट किया था उसे हटाया नहीं जाएगा। आप एक ऐसी स्थिति में कैसे समाप्त होते हैं जहां एक सूचक हटा दिया जाता है (जब यह गुंजाइश से बाहर हो जाता है), लेकिन जो डेटा इंगित करता है वह आवंटित रहता है (अप्राप्य भी)? – MDonovin

+0

@MDonovin: mmr का जवाब देखें http://stackoverflow.com/questions/2758970/c-static-array-leading-to-memory-leak/2758985#2758985। – kennytm

0

यह चला गया - सभी चले गए।

लेकिन स्मृति तुरंत अगले कार्य द्वारा उपयोग के लिए उपलब्ध है। स्टैक को सिर्फ एक सूचक के रूप में लागू किया जाता है, जब आप सी करते हैं [100] यह पॉइंटर को 100bytes नीचे ले जाता है ताकि अगली मेमोरी अनुरोध सी के बाद आती है। जब आप फ़ंक्शन को छोड़ देते हैं तो फ़ंक्शन दर्ज करने से पहले स्टैक पॉइंटर बस पिछली स्थिति पर वापस चला जाता है। यह नए/हटाए/malloc

4

की तुलना में स्मृति का प्रबंधन करने का एक बहुत तेज़ और प्रभावशाली तरीका है, उस स्थिति में, हाँ, स्मृति को हटा दिया गया है। यदि आपने कुछ ऐसा किया है:

int var = 100; 
char* c = new char[var]; 

तब फ़ंक्शन समाप्त होने के बाद यह पीछे रहेगा।

हालांकि! आधुनिक ओएस पर खोए गए मेमोरी को वापस पाने के लिए आपको रीबूट करने की आवश्यकता नहीं है। इसके बजाए, प्रक्रिया (प्रोग्राम) समाप्त होने के बाद स्मृति वापस कर दी जाएगी।

3

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

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