किसी संदर्भ के रूप में लौटाए जाने पर स्थिर चर के साथ क्या होता है और सीधे किसी अन्य फ़ंक्शन पर पॉइंटर के रूप में पास किया जाता है? जाहिर है, फ़ंक्शन रिटर्न के बाद चर रहता है, लेकिन इस पूरी अवधारणा के बारे में कुछ मुझे परेशान करता है। किस बिंदु पर डेटा-अनुक्रम पर स्मृति है, स्थिर चर द्वारा कब्जा कर लिया गया है, मुक्त? क्या रनटाइम जादुई रूप से नोटिस करता है जब मुझे किसी अन्य प्रकार की कचरा संग्रह की आवश्यकता नहीं होती है?संदर्भ के रूप में स्थैतिक स्थानीय चर लौटने
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
के लिए होता:
एक उदाहरण देना करने के लिए? मैं नहीं देख सकता कि इसे कब मुक्त किया जाएगा। क्या यह किसी प्रकार की स्मृति रिसाव नहीं होगी?
तो यह अभी भी बड़ी मात्रा में स्मृति को गले लगाएगा, बशर्ते कि यह एक अनंत लूप में चल रहा हो, है ना? या क्या यह XSDL_RectConstr() को हर बार खुद को ओवरराइट करता है? इसके अलावा, एसडीएल_एक्ट एक संरचना है, न कि वर्ग, और इस प्रकार कोई विनाशक नहीं है, लेकिन मुझे लगता है कि यह अप्रासंगिक है। – CaffeineAddict
यह स्वयं को ओवरराइट करता है, यही समस्या है। प्रत्येक संरचना (और प्रत्येक वर्ग) में विनाशक होता है, यदि आप एक नहीं लिखते हैं तो एक डिफ़ॉल्ट उत्पन्न होता है। – john
यह कुछ भी "ओवरराइट" नहीं करता है। यह वही वस्तु है। यहां एकमात्र जादू यह है कि जब तक आप उस समारोह में पहली बार प्रवेश नहीं करते हैं तब तक इसका निर्माण नहीं किया जाता है; सामान्य स्कोपिंग नियमों के अलावा, नामस्थान स्कोप में परिभाषित 'स्थैतिक' की तुलना में इसके बारे में कुछ भी अलग नहीं है। यह समारोह के एक स्थिर "सदस्य" की तरह है। –