यह आपके कोड में एक खतरनाक बग है। सी और सी ++ में आपको पर फ़ंक्शन में डेटा को ढेर करने के लिए पॉइंटर वापस करने की अनुमति नहीं है। यह अपरिभाषित व्यवहार में परिणाम देता है। मैं समझाऊंगा क्यों।
ए सी/सी ++ प्रोग्राम प्रोग्राम स्टैक को चालू और बंद डेटा दबाकर काम करता है। जब आप कोई फ़ंक्शन कॉल करते हैं, तो सभी पैरामीटर स्टैक पर धकेल जाते हैं, और फिर सभी स्थानीय चर को स्टैक पर भी धक्का दिया जाता है। जैसे ही प्रोग्राम निष्पादित होता है, यह आपके फ़ंक्शन में स्टैक को चालू और बंद कर सकता है। आपके उदाहरण में, बफर को स्टैक पर धक्का दिया जाता है, और फिर टी को स्टैक पर धक्का दिया जाता है। ढेर की तरह लग सकता है,
- पिछला ढेर
- पैरामीटर
- (अन्य डेटा)
- बफर (50000 बाइट्स)
- टी (sizeof सूचक)
इस बिंदु पर , टी ढेर पर है, और यह अंक बफर, जो ढेर पर भी है। जब फ़ंक्शन वापस आता है, रनटाइम स्टैक ऑफ पर सभी चर पॉप करता है, जो में टी, बफर और पैरामीटर शामिल हैं। आपके मामले में, आप पॉइंटर टी वापस करते हैं, इस प्रकार कॉलिंग फ़ंक्शन में इसकी एक प्रति बनाते हैं।
बुला समारोह तो लग रहा है क्या टी को बिंदुओं पर, यह उस यह ढेर है कि या मौजूद नहीं हो सकता है पर स्मृति को इंगित करता है खोजने के लिए जा रहा है।(रनटाइम ने इसे स्टैक से पॉप किया, लेकिन स्टैक पर डेटा संयोग से हो सकता है, शायद नहीं)।
अच्छी खबर यह है कि यह निराशाजनक नहीं है। स्वचालित उपकरण हैं जो आपके सॉफ़्टवेयर में इस प्रकार की त्रुटियों की खोज कर सकते हैं और उन्हें रिपोर्ट कर सकते हैं। उन्हें स्थैतिक विश्लेषण उपकरण कहा जाता है। Sentry एक ऐसे प्रोग्राम का ऐसा उदाहरण है जो इस दोष की रिपोर्ट कर सकता है।
स्रोत
2010-03-11 15:29:38
हाँ, आप सही हैं। आपको किसी फ़ंक्शन से स्थिर सरणी वापस नहीं करनी चाहिए। – AraK
@nvl भले ही 't' गतिशील रूप से आवंटित किया जा रहा हो, फिर भी बफर को सही तरीके से डुप्लिकेट करने के लिए इसे अधिभारित असाइनमेंट ऑपरेटर की आवश्यकता होगी। – KevenK
मेमोरी लीक नहीं, बस "भाग्यशाली है कि यह काम करता है"। अगर स्मृति को आवंटित सरणी को पुन: उपयोग किया जाता है, तो आपके पास आपके सरणी में कचरा होगा। यह अस्पष्ट बग बनाने का एक अच्छा तरीका है। –