2011-12-21 8 views
10

मेरे पास कुछ "वैश्विक" संरचनाएं हैं जो नए के साथ आवंटित की जाती हैं और एप्लिकेशन जीवन काल की पूरी तरह जीवित हैं।सी ++ क्या मुझे आवेदन जीवनकाल चर के लिए पॉइंटर्स हटाने को परेशान करना चाहिए?

क्या मुझे आवेदन खत्म होने से ठीक पहले पॉइंटर्स पर कॉलिंग को हटाने की परेशानी होनी चाहिए? क्या किसी भी तरह से बंद होने के बाद सभी एप्लिकेशन मेमोरी पुनः प्राप्त नहीं होती हैं?

स्पष्टता के लिए संपादित करें। मैं केवल जीवन भर की वस्तुओं के लिए मिटाने के बारे में बात नहीं कर रहा हूं, जो कार्यक्रम बंद होने के ठीक बाद "मर" है।

+0

क्यों नहीं अपने ग्लोबल वैरिएबल को पॉइंटर से स्मार्ट पॉइंटर में बदलें? आप * अभी भी विनाश के मुद्दों के क्रम में भाग सकते हैं, लेकिन केवल शायद ही कभी। यह इस बात पर निर्भर करता है कि आप चीजों को पहली जगह कैसे सेट करते हैं - यदि (स्मार्ट) पॉइंटर शून्य के रूप में शुरू होता है और बाद में इसे सौंपा जाता है, तो आमतौर पर सही con/विनाश आदेश का ट्रैक रखना मुश्किल होता है (स्मार्ट) सूचक आवंटित वस्तु के साथ शुरू किया जाता है। विनाशकों को ध्यान में रखते हुए –

उत्तर

0

नहीं, कुछ ऐसा करने के लिए कोड लिखना/डीबग/बनाए रखना न करें जो ओएस पहले से ही बहुत अच्छा है।

इसके विपरीत इसके विपरीत कारण नहीं हैं, (उदाहरण के लिए बकाया लेनदेन, फ़्लश करने के लिए फ़ाइलें, कनेक्शन बंद होने के लिए), मैं कुछ ऐसा करने के लिए लिखने के कोड को परेशान नहीं करता जो ओएस वैसे भी करने जा रहा है ।यदि एक डॉक्टर कुछ खास नहीं करता है, तो इसे क्यों परेशान करते हैं?

कई डेवलपर्स ऐप क्लोज़ समय पर सामान को हटाने/नष्ट करने/समाप्त करने/समाप्त करने में बहुत प्रयास करते हैं - एक स्मृति प्रबंधक से ऐप शटडाउन पर कुछ नकली 'रिसाव रिपोर्ट' से बचने के प्रयासों का एक भार जो स्वयं के बारे में है नष्ट हुआ।

+7

यह अविश्वसनीय है। 0 अपवॉट्स के साथ उत्तर [सही] पर 9 अपवॉट्स के साथ कैसे चुना गया? समस्या, मार्टिन, आपके दृष्टिकोण के साथ यह है कि इसे बहुत अधिक ज्ञान की आवश्यकता है। यही है, आपको प्रत्येक व्यक्तिगत मामले के लिए * पता होना चाहिए * क्या विनाशक कुछ खास करता है "। हमेशा सही ढंग से कोड लिखने की आदत में जाना बेहतर होता है, फिर इससे कोई फर्क नहीं पड़ता कि विनाशक कैसे लिखा जाता है। यह * विशेष रूप से * सच है यदि आप लाइब्रेरी कोड बुला रहे हैं जहां आपके पास यह जानने का कोई तरीका नहीं है कि विनाशक क्या करता है। –

+4

सामान्य सबक यह है कि यह * लिखने * के लिए कोड को आसान बनाने के बारे में नहीं है, यह * बनाए रखने * को आसान बनाने के बारे में है! –

+2

यदि आप "नकली" रिसाव रिपोर्ट को हटाने के लिए तैयार नहीं हैं, तो आप यह समझने के लिए कैसे जा रहे हैं कि कौन सी रिसाव रिपोर्ट "नकली" नहीं है? –

26

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

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

+0

+1। – AusCBloke

+1

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

+0

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

1

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

+0

आप अपने ओएस पर भरोसा नहीं करते हैं? यह पहले से कवर किए गए काम पर समय बिताने का कचरा है। यह, और तथ्य यह है कि जो ऐप्स 'साफ-सफाई बंद करने' का प्रयास करते हैं, वे अक्सर बंद नहीं होने का अनुमान लगाते हैं - वे वास्तव में उन ऐप्स से कम विश्वसनीय होते हैं जो ओएस को केवल उन्हें समाप्त करने के लिए कहते हैं। –

+0

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

+0

मेरे ओएस अरबों उपयोगकर्ताओं द्वारा रोजाना सोख-परीक्षण किया जाता है। मुझे लगता है कि मैं वास्तव में अच्छा कोड लिखता हूं, लेकिन मैं समान मात्रा में परीक्षण नहीं कर सकता, इसलिए मैं जितना संभव हो उतना ओएस का लाभ उठाने का प्रयास करता हूं। –

0

विनाशकों को निष्पादित नहीं किया जा रहा है (sharptooth pointer out के रूप में), मेमोरी चेकर्स को खुश करने के लिए वैश्विक वस्तुओं को हटाने के लिए भी उपयुक्त है। विशेष रूप से यदि आपका कोड किसी साझा लाइब्रेरी में है - आप अपने मेमोरी चेकर (कहना, Valgrind) आउटपुट को अव्यवस्थित नहीं करना चाहते हैं क्योंकि आपने ठीक से हटाया नहीं है।

+0

संख्या ऊपर - valgrind में कोई नकली रिसाव लॉग। डाउनसाइड - शटडाउन तंत्र का कोडिंग, परीक्षण और रखरखाव। –

+0

@ मार्टिनजेम्स: संभावना है कि कोडिंग, परीक्षण और रखरखाव कोई डाउनसाइड्स नहीं है लेकिन बस जरूरी है: एक साझा लाइब्रेरी की कल्पना करें जो वैश्विक स्तर पर 'नई' चीजें हैं लेकिन 'डिलीट' करने में विफल रहता है। यदि यह लाइब्रेरी बार-बार लोड/अनलोड हो जाती है ('dlopen' /' LoadLibrary' आदि का उपयोग करके), तो आप वास्तव में अधिक से अधिक संसाधनों को लीक करते रहेंगे। आपको * कोड, परीक्षण और रखरखाव के साथ इसे संभालना होगा। –

+0

मैंने 'कोई नकली रिसाव' पोस्ट नहीं किया। यदि आपके द्वारा वर्णन किए जाने पर लाइब्रेरी लीक हो जाती है, तो सुनिश्चित करें कि समस्या ठीक करें! मेरे पास एकमात्र मुद्दा है जो फिक्सिंग समस्याओं के साथ है जो मौजूद नहीं हैं। –

1

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

2

सबकुछ साफ करने के लिए हमेशा अच्छा अभ्यास होता है, हालांकि स्मृति को पुनः प्राप्त किया जाता है, इन वस्तुओं में आवंटित अन्य संसाधनों (साझा स्मृति, smeaphores आदि) हो सकता है जिसे संभवतः वस्तुओं विनाशकों द्वारा साफ किया जाना चाहिए।

यदि आप इन संसाधनों को पकड़ने के लिए हटाए गए पॉइंटर्स का उपयोग नहीं करना चाहते हैं, तो एप्लिकेशन बाहर निकलने पर उन्हें सही तरीके से साफ़ कर दिया जाता है।

आप अपने आवेदन का परीक्षण कैसे कर रहे हैं? सफाई नहीं करना एक सभ्य परीक्षण दोहन के विकास में बाधा डाल सकता है। एप्लिकेशन के टेस्ट शट डाउन को फिर से शुरू करने और पुनरारंभ करने का एक तरीका चाहते हैं।

उस सरल रिलीजिंग मेमोरी को साफ करने के लिए और भी कुछ है।

+0

यह सुनिश्चित है कि, यदि कोई प्रयास किया गया है और परीक्षण किया गया विकल्प है तो इसे स्वयं करने का प्रयास करना सबसे अच्छा है। –

0

.. फिर वहाँ उन मामलों में जहाँ आप निश्चित रूप से नहीं चाहते हैं dtor के सभी से पहले ओएस प्रक्रिया, समाप्त हो जाता है पर कहा जाता है जैसे:

1) dtor ठीक से काम नहीं करता है, क्योंकि यह एक को समाप्त करने की कोशिश करता है थ्रेड, थ्रेड हैंडल या अन्य सिग्नल पर विफल रहता है, (बारहमासी 'जुड़ें/प्रतीक्षा करें' डेडलॉक) - सभी घरों का 99% का कारण 'मेरा ऐप साफ-सुथरा नहीं होगा' पोस्ट।

2) जब dtor ठीक से काम नहीं करता है क्योंकि यह वैसे भी बुरा है और लाइब्रेरी में दफन किया गया है।

3) जहां स्मृति को प्रक्रिया धागे से बाहर निकालना होगा, वहां बंद होने पर segfaults/AV होगा, (उदाहरण के लिए बफर ऑब्जेक्ट्स के पूल जो थ्रेड अच्छी तरह से बंद हो सकते हैं)।

4) किसी अन्य 'विशेष मामले' जहां ऑब्जेक्ट का विनाश ओएस को छोड़ दिया जाना है।

ऐसे कई 'विशेष मामले' हैं जिन्हें मैं विशेष मामले के रूप में शट डाउन कोड 'सफाई' मानता हूं।

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