2012-11-16 45 views
11

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

SDL_Rect* XSDL_RectConstr(int x, int y, int w, int h) 
{ 
    static SDL_Rect rect; 
    rect.x = x; 
    rect.y = y; 
    rect.w = w; 
    rect.h = h; 

    return ▭ 
} 

void mainLoop() 
{ 
    while(isRunning) 
    { 
     pollEvents(); 
     SDL_BlitSurface(someSurface, XSDL_RectConstr(0, 0, 100, 100), screen, NULL); 
     SDL_Flip(screen); 
    } 
} 

क्या SDL_BlitSurface() रिटर्न के बाद rect के लिए होता:

एक उदाहरण देना करने के लिए? मैं नहीं देख सकता कि इसे कब मुक्त किया जाएगा। क्या यह किसी प्रकार की स्मृति रिसाव नहीं होगी?

उत्तर

10

जो बिंदु पर डेटा-सिलसिलेवार पर स्मृति, स्थिर चर के कब्जे में, मुक्त हो जाता है? क्या रनटाइम जादुई रूप से नोटिस करता है जब मैं को किसी प्रकार की कचरा संग्रह की तरह इसकी आवश्यकता नहीं है?

इसे प्रोग्राम से बाहर निकलना होगा, जल्द से जल्द नहीं। इसके अलावा, यह गारंटी है कि विनाशकों को बुलाया जाएगा।

+0

तो यह अभी भी बड़ी मात्रा में स्मृति को गले लगाएगा, बशर्ते कि यह एक अनंत लूप में चल रहा हो, है ना? या क्या यह XSDL_RectConstr() को हर बार खुद को ओवरराइट करता है? इसके अलावा, एसडीएल_एक्ट एक संरचना है, न कि वर्ग, और इस प्रकार कोई विनाशक नहीं है, लेकिन मुझे लगता है कि यह अप्रासंगिक है। – CaffeineAddict

+1

यह स्वयं को ओवरराइट करता है, यही समस्या है। प्रत्येक संरचना (और प्रत्येक वर्ग) में विनाशक होता है, यदि आप एक नहीं लिखते हैं तो एक डिफ़ॉल्ट उत्पन्न होता है। – john

+1

यह कुछ भी "ओवरराइट" नहीं करता है। यह वही वस्तु है। यहां एकमात्र जादू यह है कि जब तक आप उस समारोह में पहली बार प्रवेश नहीं करते हैं तब तक इसका निर्माण नहीं किया जाता है; सामान्य स्कोपिंग नियमों के अलावा, नामस्थान स्कोप में परिभाषित 'स्थैतिक' की तुलना में इसके बारे में कुछ भी अलग नहीं है। यह समारोह के एक स्थिर "सदस्य" की तरह है। –

4

rectSDL_BlitSurface से वापसी पर मुक्त नहीं किया जाएगा, लेकिन यह स्मृति स्मृति रिसाव नहीं होगा: यह स्थैतिक भंडारण में है, इसलिए "रिसाव" के लिए कुछ भी नहीं है। जब तक आपका प्रोग्राम चल रहा है तब तक ऑब्जेक्ट स्मृति में रहेगा।

जब आप मल्टीथ्रेडिंग शुरू करते हैं तो इसका सबसे बड़ा नकारात्मक हिस्सा होता है: आपका स्थैतिक चर एक साथ कई धागे से संशोधित होने का जोखिम चलाता है, जो कि आप इससे बचने के लिए कुछ ऐसा करते हैं।

Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.

+0

मैं फ़ंक्शन के चारों ओर एक म्यूटेक्स लॉक का उपयोग कर बहु-थ्रेडिंग समस्या को ठीक कर सकता हूं, सही? – CaffeineAddict

+0

@cyberpunk_ हां, यह सही है। म्यूटेक्स को फ़ंक्शन के कॉल के आस-पास होने की आवश्यकता होती है और उस कोड को शामिल किया जाता है जहां आप आवृत्ति के साथ स्थिर चर से मूल्य का उपयोग करते हैं। – dasblinkenlight

4

कोई स्मृति रिसाव नहीं है, लेकिन यह एक सच में, सच बुरा विचार है। मान लीजिए आप इस

SDL_someFunction(
    XSDL_RectConstr(0, 0, 100, 100), 
    XSDL_RectConstr(20, 20, 30, 30) 
); 

जैसे कुछ कोड लिखा है क्योंकि आप केवल एक स्थिर आयत है, SDL_someFunction अलग आयतों कि ऐसा लगता है कि यह हो रहा है पाने के लिए नहीं जा रहा है। इसके बजाय आपको दो बार एक ही आयत मिल जाएगी।

+0

तो मुझे लगता है कि अगर मैं यह सुनिश्चित करने के लिए इसका उपयोग करता हूं कि मुझे हमेशा एक ही डेटा मिलता है, तो ठीक है, है ना? –