मैं इस प्रश्न से खुद को निम्नलिखित कार्यक्रम के बारे में उलझन में छुटकारा पाने के लिए कह रहा हूं। मुझे पता है कि कुछ संदर्भों में एक सरणी का उपयोग करके सरणी को अपने पहले तत्व में एक पॉइंटर को क्षय करने में मदद मिलेगी। मेरे पास एक ऐसा फ़ंक्शन है जो पॉइंटर द्वारा इस सरणी को लौटाता है (यह फ़ंक्शन new[]
का उपयोग करके बनाया गया है)। क्या सरणी क्षय हो जाएगी, जिसके कारण पॉइंटर केवल पहले तत्व को इंगित करेगा? यहां एक उदाहरण दिया गया है:क्या किसी फ़ंक्शन से गतिशील रूप से आवंटित सरणी लौटने से मेमोरी लीक हो जाती है?
int *foo() {
int *t = new int[10];
return t;
}
int main() {
int *p = foo();
}
यह वह जगह है जहां भ्रम का अनुसरण होता है। मुझे नहीं पता कि p
पहले तत्व या पूरे सरणी को इंगित करता है। तो मेरे पास निम्नलिखित प्रश्न हैं:
- सूचक द्वारा सरणी को वापस करने से इसका क्षय होता है (और इसके परिणामस्वरूप स्मृति रिसाव होता है)?
- क्या
p
सरणी के पहले तत्व को इंगित करता है? delete[]
p
पर उपयोग नहीं किया गया है यदि उपरोक्त दो सत्य हैं तो अपरिभाषित व्यवहार का कारण बनता है?
मुझे उम्मीद है कि इन सवालों का उत्तर दिया जा सकता है, इसलिए मैं इस कार्यक्रम को पूरी तरह से समझ सकता हूं। धन्यवाद।
यदि आपकी अगली पंक्ति 'p = '' या कुछ है, तो आप foo से लौटाए गए पॉइंटर को" खो देंगे ", और बूम ... मेमोरी लीक। यदि आप आवंटित किसी भी स्मृति को साफ करने की उपेक्षा करते हैं तो यह केवल एक स्मृति रिसाव है। और उस हिस्से का हिस्सा उस स्मृति को "भूलना" या "खोना" पॉइंटर्स हो सकता है। –
"क्षय" गतिशील भंडारण अवधि के साथ बनाई गई वस्तुओं पर कुछ भी नहीं करता है। यह सिर्फ कुछ ऐसा वर्णन करता है जो सरणी अभिव्यक्तियों के साथ होता है, जो उन्हें पॉइंटर प्रकार के रूप में व्यवहार करता है। – aschepler
मेमोरी लीक इस बारे में नहीं हैं कि आप अपने आवेदन में पॉइंटर्स कैसे पास करते हैं, लेकिन यह सुनिश्चित है कि आप कैसे सुनिश्चित करते हैं ("इसे प्रबंधित करें") कि आवंटित की गई सभी मेमोरी को भी हटा दिया जा रहा है। मेमोरी मैनेजमेंट जितना आसान होगा, उतना कम मौका है कि आपके कोड में मेमोरी रिसाव है ~> तो बस [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) जितना संभव हो उसका पालन करें :) – LihO