2014-04-15 5 views
5

एक सहकर्मी के साथ यह चर्चा कर रही है। जब सी # या जावा कचरा जैसी भाषाएं स्ट्रिंग जैसी वस्तुओं को इकट्ठा करती हैं, उन्हें वापस ढेर में वापस लौटती हैं, तो क्या वे इस मेमोरी ब्लॉक को भी साफ करते हैं, उदाहरण के लिए 0 या 1 के साथ ओवरराइटिंग?क्या मेमोरी संग्रह से पहले स्मृति साफ़ हो गई है?

मेरी धारणा यह है कि ब्लॉक को वापस लौटा दिया जाता है, जब तक कि कोई ब्लॉक को 0 से अधिक तक अधिभारित करने के साथ सुरक्षित स्ट्रिंग जैसे वर्गों का उपयोग नहीं करता।

+0

सुरक्षा कारणों से, कम से कम, शून्य के लिए, मेरे लिए * तर्क * होगा। – Eugene

+0

संबंधित: http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794 – Servy

+1

आमतौर पर भाषा कार्यान्वयन प्रदर्शन का समर्थन करते हैं। इसलिए, जब उन्हें करना होता है तो वे केवल स्मृति को शून्य करते हैं, और कचरा इकट्ठा करते समय इसे करने के लिए विकल्प दिया जाता है * या * आवंटित करते समय, उन्होंने आवंटित करते समय चुना - बस क्योंकि वे "जितना संभव हो उतना कम काम करते हैं" सिद्धांत का पालन करते हैं। – Durandal

उत्तर

3

व्यावहारिक रूप से बोलना, नहीं, ऐसा नहीं होता है। ओवरराइटिंग मेमोरी जिसे आपने अभी खाली कर लिया है, समय लगता है, इसलिए प्रदर्शन दंड हैं। SecureString जैसे "सुरक्षित" ऑब्जेक्ट्स just wiping themselves हैं, जीसी पर भरोसा नहीं करते हैं।

अधिक व्यापक रूप से, यह उस विशेष भाषा के उस विशेष कार्यान्वयन पर बहुत निर्भर करता है। प्रत्येक भाषा जो जीसी (जैसे सी #) के अस्तित्व को मानती है, कचरा संग्रह कब और कब होने के बारे में विभिन्न नियम निर्दिष्ट करता है।

अपने सी # उदाहरण लेते हैं, सी # विनिर्देश की आवश्यकता नहीं है कि वस्तुओं मुक्त कर दिया जा रहा है के बाद ओवरराइट किया, और यह न करे नहीं करता है या तो:

अंत में, कुछ समय में के बाद वस्तु के योग्य हो जाता संग्रह, कचरा कलेक्टर उस वस्तु से जुड़े स्मृति को मुक्त करता है।

§3.9 C# 5.0 Language Specification

स्मृति बाद में एक संदर्भ प्रकार को सौंपा गया है, तो आप एक निर्माता है कि अपने स्वयं के कस्टम प्रारंभ करता होगा। स्मृति बाद में एक मान प्रकार का कार्य सौंपा गया है, तो इसे बाहर ध्यान केंद्रित किया जाता है इससे पहले कि आप से पढ़ना शुरू कर सकते हैं:

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

§5.2 C# 5.0 Language Specification

इसके अतिरिक्त, वहाँ सी # के कम से कम दो कार्यान्वयन - माइक्रोसॉफ्ट के कार्यान्वयन और मोनो के कार्यान्वयन, तो बस "सी #" पर्याप्त विशिष्ट नहीं है। प्रत्येक कार्यान्वयन स्मृति (या नहीं) को ओवरराइट करने का निर्णय ले सकता है।

+0

शायद एक बेवकूफ सवाल है, लेकिन अगर आपने दो बाइट ए और बी को मुक्त किया है, और बी में कुछ हैं (कुछ जानकारी)। जीसी स्मृति को पुनः प्राप्त करता है, और इन दो बाइट किसी और को दिया जाता है, जो केवल एक बाइट को लिखता है। इसे कैसे संभाला जाएगा? क्या यह पुराना डेटा प्रेरित नहीं करता है? – Eugene

+0

@ यूजीन: मान लीजिए कि एक काल्पनिक भाषा में संभव था, जिसे आमतौर पर प्रोग्रामिंग त्रुटि माना जाएगा। इससे पहले कि आप इसे पढ़ने से पहले डेटा को हमेशा प्रारंभ करना चाहिए। –

+0

@ यूजीन 'असुरक्षित' कोड के बाहर, सी # आप * में * स्मृति को पढ़ नहीं सकता है जो आपके लिए आवंटित नहीं किया गया है। यह सुनिश्चित करने के लिए अपने रास्ते से बाहर निकलता है कि स्मृति मुक्त होने के बाद स्मृति को पढ़ने के लिए कोई रास्ता नहीं है। यदि स्मृति को सी # में लिखे गए कुछ कोड पर दिया गया है, और यह इसके लिए आवंटित स्मृति को पहले समाशोधन/सेटिंग के बिना आवंटित करने का निर्णय लेता है, तो यह कर सकता है। ऐसे मामलों में क्या दिखाई देगा इसके लिए कोई परिभाषित व्यवहार नहीं है। – Servy

2

मेरे ज्ञान के विस्तार के लिए एक कचरा कलेक्टर नहीं है जो वास्तव में 0 या किसी भी संख्या के साथ मेमोरी मिटा देता है। सी # और जावा कचरा कलेक्टर अप्रयुक्त वस्तुओं से मेमोरी पुनः प्राप्त करें और इसे उपलब्ध के रूप में चिह्नित करें। SecureString खुद को अंतिम रूप देने पर पोंछता है लेकिन यह एक जीसी चीज नहीं है।

संबंधित मुद्दे