डेल्फीऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए समर्थन समृद्ध और शक्तिशाली है। कक्षाएं और ऑब्जेक्ट्स मॉड्यूलर कोड प्रोग्रामिंग के लिए अनुमति देते हैं। अधिक मॉड्यूलर और अधिक जटिल घटकों के साथ और अधिक परिष्कृत और अधिक जटिल आते हैं कीड़े.
विकास करते हुए डेल्फी में आवेदन (लगभग) हमेशा मज़ेदार होता है, ऐसे हालात होते हैं जब आपको लगता है कि पूरी दुनिया आपके खिलाफ है।
जब भी आपको डेल्फी में एक ऑब्जेक्ट का उपयोग (बनाने) करने की आवश्यकता होती है, तो आपको उस मेमोरी को मुक्त करने की आवश्यकता होती है जो इसे भस्म हो जाती है (एक बार जरूरत नहीं होती है)। निश्चित रूप से, कोशिश / अंत में मेमोरी गार्डिंग ब्लॉक आपको मेमोरी लीक को रोकने में मदद कर सकते हैं; अपने कोड को सुरक्षित रखना अब भी आपके ऊपर है।
एक मेमोरी (या संसाधन) रिसाव तब होता है जब प्रोग्राम उस मेमोरी को मुक्त करने की क्षमता खो देता है जो वह खपत करता है। बार-बार मेमोरी लीक होने से किसी प्रक्रिया का मेमोरी उपयोग बिना सीमा के बढ़ने लगता है। मेमोरी लीक एक गंभीर समस्या है - यदि आपके पास कोड चल रहे एप्लिकेशन में मेमोरी लीक का कारण है 24/7, एप्लिकेशन उपलब्ध सभी मेमोरी को खा जाएगा और अंत में मशीन को जवाब देना बंद कर देगा।
डेल्फी में मेमोरी लीक्स
मेमोरी लीक से बचने के लिए पहला कदम यह समझना है कि वे कैसे होते हैं। निम्नलिखित कुछ सामान्य नुकसान पर एक चर्चा है और गैर-लीकिंग डेल्फी कोड लिखने के लिए सर्वोत्तम अभ्यास।
अधिकांश (सरल) डेल्फी अनुप्रयोगों में, जहां आप घटकों (बटन, मेमो, एडिट्स, आदि) का उपयोग करते हैं। आप एक फॉर्म (डिजाइन समय पर) पर छोड़ते हैं, आपको मेमोरी प्रबंधन के बारे में बहुत अधिक देखभाल करने की आवश्यकता नहीं है। एक बार जब कंपोनेंट को फॉर्म पर रखा जाता है, तो फॉर्म उसका हो जाता है मालिक और फार्म बंद होने (नष्ट होने) के बाद घटक द्वारा ली गई मेमोरी को मुक्त कर देगा। प्रपत्र, स्वामी के रूप में, इसके द्वारा होस्ट किए गए घटकों की मेमोरी डीलोकेशन के लिए जिम्मेदार है। संक्षेप में: किसी प्रपत्र पर घटक स्वचालित रूप से बनाए और नष्ट किए जाते हैं
मेमोरी लीक्स के उदाहरण
किसी भी गैर-तुच्छ डेल्फी एप्लिकेशन में, आप करना चाहेंगे तत्काल डेल्फी घटकों को चलाने के समय पर. आपकी अपनी कुछ कस्टम क्लासेस भी होंगी। मान लीजिए कि आपके पास एक वर्ग TDeveloper है जिसमें एक विधि DoProgram है। अब, जब आपको TDeveloper वर्ग का उपयोग करने की आवश्यकता होती है, तो आप कॉल करके कक्षा का एक उदाहरण बनाते हैं सृजन करना विधि (निर्माता)। बनाएँ विधि एक नई ऑब्जेक्ट के लिए मेमोरी आवंटित करता है और ऑब्जेक्ट के लिए एक संदर्भ देता है।
वर
zarko: TDeveloper
शुरू
zarko: = TMyObject। सृजन करना;
Zarko। DoProgram;
समाप्त;
और यहाँ एक सरल स्मृति रिसाव है!
जब भी आप कोई ऑब्जेक्ट बनाते हैं, तो आपको उस मेमोरी को डिस्पोज़ करना चाहिए जो उसके कब्जे में है। किसी ऑब्जेक्ट को आवंटित की गई मेमोरी को खाली करने के लिए, आपको कॉल करना होगा नि: शुल्क तरीका। पूरी तरह से सुनिश्चित करने के लिए, आपको कोशिश / अंत में ब्लॉक का उपयोग करना चाहिए:
वर
zarko: TDeveloper
शुरू
zarko: = TMyObject। सृजन करना;
प्रयत्न
Zarko। DoProgram;
आखिरकार
Zarko। नि: शुल्क;
समाप्त;
समाप्त;
यह सुरक्षित मेमोरी एलोकेशन और डीललोकेशन कोड का एक उदाहरण है।
चेतावनी के कुछ शब्द: यदि आप डेल्फी घटक को गतिशील रूप से त्वरित करना चाहते हैं और कुछ समय बाद स्पष्ट रूप से इसे मुक्त करते हैं, तो हमेशा मालिक के रूप में शून्य पास करें। ऐसा करने में विफलता अनावश्यक जोखिम, साथ ही प्रदर्शन और कोड रखरखाव समस्याओं का परिचय दे सकती है।
Create and Free मेथड का उपयोग करके ऑब्जेक्ट बनाने और नष्ट करने के अलावा, आपको "बाहरी" (फाइल, डेटाबेस, आदि) संसाधनों का उपयोग करते समय भी बहुत सावधान रहना चाहिए।
मान लें कि आपको कुछ टेक्स्ट फ़ाइल पर काम करना है। एक बहुत ही सरल परिदृश्य में, जहां फ़ाइल के साथ डिस्क पर फ़ाइल को संबद्ध करने के लिए AssignFile विधि का उपयोग किया जाता है चर जब आप फ़ाइल के साथ समाप्त हो जाते हैं, तो आपको फ़ाइल हैंडल को शुरू करने के लिए बंद करने के लिए CloseFile को कॉल करना होगा उपयोग किया गया। यह वह जगह है जहां आपके पास "फ्री" के लिए एक स्पष्ट कॉल नहीं है।
वर
एफ: टेक्स्टफाइल;
एस: स्ट्रिंग;
शुरू
AssignFile (F, 'c: \ somefile.txt');
प्रयत्न
Readln (एफ, एस);
आखिरकार
क्लोज़फ़ाइल (एफ);
समाप्त;
समाप्त;
एक अन्य उदाहरण में आपके कोड से बाहरी DLL लोड करना शामिल है। जब भी आप LoadLibrary का उपयोग करते हैं, तो आपको FreeLibrary को कॉल करना होगा:
वर
dllHandle: थैंडल;
शुरू
dllHandle: = लोडलॉर्डर ('MyLibrary) डीएलएल ');
// इस DLL के साथ कुछ करें
अगर dllHandle <> 0 तो FreeLibrary (dllHandle);
समाप्त;
.NET में मेमोरी लीक्स?
हालाँकि .NET के लिए डेल्फी के साथ कचरा कलेक्टर (GC) अधिकांश मेमोरी कार्यों का प्रबंधन करता है, लेकिन .NET एप्लिकेशन में मेमोरी लीक होना संभव है। यहाँ एक लेख चर्चा है .NET के लिए डेल्फी में जीसी.
मेमोरी लीक्स के खिलाफ कैसे लड़ें
मॉड्यूलर मेमोरी-सुरक्षित कोड लिखने के अलावा, स्मृति लीक को रोकने के लिए उपलब्ध कुछ तृतीय-पक्ष टूल का उपयोग करके किया जा सकता है। डेल्फी मेमोरी लीक फिक्स टूल आप डेल्फी आवेदन को पकड़ने में मदद करें त्रुटियों जैसे कि मेमोरी करप्शन, मेमोरी लीक, मेमोरी एलोकेशन एरर, वैरिएबल इनिशियलाइज़ेशन एरर्स, वेरिएबल डेफिनिशन कंफर्ट, पॉइंटर एरर और बहुत कुछ।