2010-01-09 16 views

उत्तर

13

नहीं, ऐसा नहीं होगा, क्योंकि डीलोकेशन में सूचक को बदलने की शक्ति नहीं है। यह केवल यह कर सकता है कि आपने पॉइंटर पर सूचक पारित किया है।

यदि आप यह सुनिश्चित करना चाहते हैं कि यह शून्य पर सेट है, तो आपको इसे स्वयं करना होगा।

कुछ इस अच्छे अभ्यास पर विचार करते हैं, कुछ लोग इसे समय बर्बाद मानते हैं क्योंकि आपके कोड को स्थगित करने के बाद पॉइंटर्स का उपयोग न करने के लिए संरचित किया जाना चाहिए (फिर से आवंटित होने तक)।

मैं वास्तव में बाद के शिविर की तरफ झुकता हूं लेकिन मैं देख सकता हूं कि क्यों लोग खुद को मुक्त स्मृति तक पहुंचने से बचाने के लिए चाहते हैं (प्रोग्रामिंग रक्षात्मक रूप से शायद ही कभी एक बुरा विचार है)। इस स्थिति का

+0

मैं एक पॉइंटर को सुरक्षित रूप से रिलीज़ करने के लिए एक मैक्रो सेट करता हूं और इसे 'शून्य' पर सेट करता हूं। – notnoop

+0

+1 एफवाईआई, कचरा संग्रह का उपयोग करते समय, '__weak' पॉइंटर्स "स्व-शून्यकरण" होते हैं। इसके अलावा, ऐसा करने के लिए मैक्रो का उपयोग त्रुटि प्रवण हो सकता है, जैसा कि मैंने नीचे दिए गए मेरे उत्तर में उल्लेख किया है। –

+1

यदि आप रिलीज करते समय शून्य के संदर्भ को सेट नहीं करते हैं, तो लीक्स आपको यह बताने में सक्षम नहीं होंगे कि स्मृति मेमोरी है - जहां तक ​​लीक का संबंध है, आपके पास एक वैध संदर्भ है, भले ही आप संदर्भ सोचें अब वैध (अति-प्रतिधारण) नहीं है। –

2

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

+0

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

1

सोचें:

void *p = malloc (100); 

while (someCondition) 
{ 
    // do something with p 
} 

free (p); 

// p is not set to NULL for you, it still points to where it always did 

इसी प्रकार, जब एक ऑब्जेक्टिव-सी वस्तु पुनः आवंटित की जाती है, उस वस्तु के लिए किसी भी संकेत दिए गए अभी भी जहां यह था ओर इशारा करते हैं। यह त्रुटियों का कारण बनता है जब एक अन्य वस्तु को एक ही स्थान में आवंटित किया जाता है (या यहां तक ​​कि यदि एक ही स्थान में कुछ भी आवंटित नहीं किया जाता है)।

5

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

उद्देश्य-सी कचरा संग्रह के लिए कई अन्य लाभ, और यदि आप कर सकते हैं तो मैं इसका उपयोग करने की सलाह देता हूं। (यह ओएस एक्स 10.5+ पर उपलब्ध है, लेकिन आईफोन ओएस पर नहीं।) हिम तेंदुए में प्रदर्शन सुधार सबसे प्रभावशाली हैं, और यह पहले से ही शुरूआती तेजी से खराब था।

कहा जा रहा है कि, @darren एक अच्छा बिंदु है: आमतौर पर अपनी सामग्री को जारी करते समय अपने स्वयं के चर को कम करने के लिए यह अच्छा अभ्यास है। यदि आप ओवर-रिलीज ऑब्जेक्ट्स पर पॉइंटर्स को लटकने से बचने के लिए देख रहे हैं, तो आपकी सबसे अच्छी शर्त वैरिएबल को नेल करने की आदत को अपनाना है। यह रनटाइम ओवरहेड नहीं लेगा, और यह पठनीय है। सबसे महत्वपूर्ण बात यह है कि, शून्य के लिए चर सेट करने से कचरा संग्रहण प्रणाली सबसे प्रभावी ढंग से काम करती है, क्योंकि यह स्मृति को इंगित करती है जिसे सुरक्षित रूप से पुनः प्राप्त किया जा सकता है। कोड फिर दोनों मोड में पूरी तरह से काम करेगा।

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

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