2009-10-06 12 views
8

में ऑब्जेक्ट क्लियरिंग/सरणी डिलीओशन वास्तव में आवश्यक है वीबी के बारे में मैंने जो कुछ सीखा है, मैंने स्टेटिक कोड विश्लेषण (विशेष रूप से एवोस्टो के प्रोजेक्ट विश्लेषक) का उपयोग करने से सीखा। और चीजों में से एक यह जांचता है कि क्या आपने सभी वस्तुओं और सरणी को मंजूरी दे दी है या नहीं। मैं इसे अंधा कर देता था क्योंकि पीए ने ऐसा कहा था। लेकिन अब जब मैं वीबी संसाधनों को जारी करता हूं, तो मुझे लगता है कि यह चीजें स्वचालित रूप से होनी चाहिए। क्या यह पूर्व वीबी 6 से एक विरासत विशेषता है, या क्या कोई कारण है कि आपको स्पष्ट रूप से ऑब्जेक्ट को कुछ भी नहीं सेट करना चाहिए और सरणी पर मिटा देना चाहिए?क्या वीबी 6/वीबीए (पेशेवर/विपक्ष?)

उत्तर

4

समस्या, जैसा कि मैं इसे समझता हूं, इस तथ्य के साथ करना है कि वीबी 6 (और इसके पूर्ववर्तियों) की जड़ें COM में हैं, और इसकी संदर्भ-गणना कचरा संग्रहण प्रणाली है।

उदाहरण के लिए, कल्पना करें कि आप किसी तृतीय पक्ष लाइब्रेरी से किसी ऑब्जेक्ट को एक रिफ़र्न्स घोषित करते हैं। उस ऑब्जेक्ट में एक COM संदर्भ गणना है जिसका प्रयोग इसे जीवित रखने के लिए किया जाता है और यह निर्धारित करने के लिए किया जाता है कि इसे कब नष्ट किया जाना चाहिए। जब आप इसे कुछ भी सेट नहीं करते हैं तो यह नष्ट नहीं होता है, लेकिन जब वस्तु का संदर्भ गणना शून्य तक पहुंच जाती है।

अब, सभी COM घटक विजुअल बेसिक में नहीं लिखे गए थे। कुछ सी या सी ++ में लिखे गए थे। संरचित अपवाद हैंडलिंग सभी भाषाओं में मौजूद नहीं थी। तो यदि कोई त्रुटि हुई, तो ऑब्जेक्ट पर संदर्भ गणना को ठीक से कम करने की गारंटी नहीं थी, और COM ऑब्जेक्ट्स को उनके इच्छित इरादे से लंबे समय तक लटकने के लिए जाना जाता था। यह विजुअल बेसिक, प्रति से एक समस्या नहीं थी। यह एक COM समस्या थी। (और वह, आप ध्यान दें, यही कारण है कि .NET संदर्भ गणना का उपयोग नहीं करता है।)

यही कारण है कि विजुअल बेसिक डेवलपर्स दिनचर्या से बाहर निकलने से पहले ऑब्जेक्ट संदर्भ जारी करने के बारे में जुनूनी बन गए। आप बस इतना नहीं जानते कि आप जो घटक आवंटित कर रहे हैं वह हुड के नीचे बना रहा है। लेकिन जब आप इसका संदर्भ जारी करते हैं, तो आप कम से कम अपनी संदर्भ गणना जारी कर रहे हैं। यह लगभग एक धार्मिक मंत्र बन गया। घोषणा, उपयोग, रिलीज। यह चीजों को करने का COM तरीका था।

निश्चित रूप से, स्टैक पर घोषित डीरेंसिंग चरों पर विजुअल बेसिक बेहतर या तेज़ हो सकता है। लेकिन मान लीजिए, मैं यह कहना चाहता हूं कि उन वस्तुओं को जारी किया गया था। जब आप मेमोरी रिसाव को ट्रैक करने की कोशिश कर रहे हों तो थोड़ा आश्वासन एक लंबा रास्ता तय करता है।

0

मैं हमेशा इसे अच्छी प्रैक्टिस के लिए करता हूं, आप कभी नहीं जानते कि अगर आप एक में गिरते हैं और आपकी ऑब्जेक्ट्स को डिलीकेट नहीं किया जाता है तो अपवाद क्या हो सकता है। आपको अंततः बयानों में उन्हें परेशान करना चाहिए और सुनिश्चित करना चाहिए कि वे किसी भी स्मृति का उपयोग नहीं कर रहे हैं अन्यथा आप स्मृति रिसाव में भाग सकते हैं।

मुझे ट्रैकर सिस्टम के एक साधारण समय के अंदर कोई समस्या थी, जहां सर्वर यादृच्छिक रूप से दुर्घटनाग्रस्त हो रहा था, यह निर्धारित करने के लिए सप्ताह लग गए कि यह किसी ऑब्जेक्ट की स्मृति रिसाव थी जिसे स्वयं स्वयं को नष्ट करना था। मेरा कोड अपवाद में फेंक दिया गया था और सर्वर के बाद (वास्तविक वेबसाइट पूरी सर्वर नहीं) के कारण खुद को साफ नहीं किया गया था।

+0

दिलचस्प, पूछ सकता है कि यह किस प्रकार की वस्तु थी? इसका दायरा क्या था? क्या यह एक ट्रैपबल अपवाद फेंक दिया गया था, या ऐप सिर्फ दुर्घटनाग्रस्त हो गया था? जब एक मानक अपवाद फेंक दिया जाता है तो प्रक्रिया समाप्त हो जाती है। भले ही अपवाद के द्वारा, सभी स्थानीय संदर्भ अभी भी स्वचालित रूप से नष्ट हो गए हैं। तो अगर प्रक्रिया के बाहर वस्तु के कोई संदर्भ नहीं थे, तो ऑब्जेक्ट को "जीवित" रहने का कारण क्या था? – Oorang

+2

वीबी 6/वीबीए में कोई कोशिश/पकड़/अंत में ब्लॉक या अपवाद नहीं हैं। – HardCode

+0

कोई कोशिश/कैच/अंत में ब्लॉक नहीं हैं, लेकिन trappable अपवाद हैं। Err.Raise पर एक नज़र डालें। – Oorang

-2

हां, सभी ऑब्जेक्ट्स को कुछ भी सेट करें और जितना संभव हो उतना साफ करें। आपकी सामग्री को साफ नहीं करते समय वीबी 6 मेमोरी लीक रखने के लिए कुख्यात है। कचरा संग्रह वीबी 6/वीबीए में उप-पैरा था।

+0

हाय हार्डकोड, मैंने अक्सर इस भावना को व्यक्त किया है। हालांकि मैं क्या कोशिश कर रहा हूं एक ठोस/पुनरुत्पादित उदाहरण है? – Oorang

+0

वीबी 6 के कचरा संग्रहण तंत्र के साथ कुछ भी गलत नहीं है। यह अन्य घटक हैं जो उचित रूप से संदर्भ जारी नहीं करते हैं या जिसके लिए इसे तोड़ने वाले बहुत विशिष्ट टियरडाउन अर्थशास्त्र की आवश्यकता होती है। यह वीबी 6 की गलती नहीं है कि खराब लिखित घटक हैं जो नियमों का पालन नहीं करते हैं। –

+4

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

13

Advanced Visual Basic 6 के लेखक मैट कर्लैंड, जो कि हम में से अधिकांश की तुलना में विजुअल बेसिक के बारे में अधिक जानते हैं, सोचते हैं कि यह बर्बाद प्रयास है। डीएओ के बारे में इस उद्धरण (पी 110) पर विचार करें, COM डेटा एक्सेस लाइब्रेरी जो मुख्य रूप से एक्सेस डेटाबेस इंजन को लक्षित करती है:

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

+0

हाय ओडीडब्ल्यू, यह मेरी सोच की रेखा के समानांतर है। डीएओ एकमात्र वस्तु है जिसे मैं जानता था कि निश्चित रूप से सही ढंग से जारी किया जाना था (Win32 के बाहर)। क्या आप किसी अन्य "विशेष मामलों" से अवगत हैं? – Oorang

2

क्या आपने यह Aivosto web page (परियोजना विश्लेषक के निर्माता से) पढ़ा है?

आप स्थैतिक चर का उपयोग कर रहे हैं, तो यह स्मृति वे पर कब्जा कर लिया है जब आप चर किसी भी अधिक की जरूरत नहीं है पुनः प्राप्त करने के लिए महत्वपूर्ण है। गतिशील वैरिएबल मेमोरी समस्या का इतना अधिक नहीं है, क्योंकि प्रक्रिया समाप्त होने पर नष्ट हो जाती है।

दूसरे शब्दों में, आपको सामान्य, गैर स्थैतिक, स्थानीय चर को साफ़ करने के बारे में चिंता करने की आवश्यकता नहीं है।

+0

+1 इसे ध्यान में रखते हुए :) हालांकि यह एक बहुत ही दुर्लभ दिन है जब मैं सांख्यिकी का उपयोग कर रहा हूं। अगर मुझे कुछ याद आती है तो मैं आमतौर पर निजी मॉड्यूल स्तर चर का उपयोग करता हूं। – Oorang