2010-03-31 12 views
11

जहां तक ​​मुझे पता है, एक अपरिचित अपवाद के मामले में, सी ++ स्थानीय चर को तुरंत नष्ट कर देता है, जावा संदर्भों को रिलीज़ करता है और बाकी को कचरा कलेक्टर के लिए छोड़ देता है।स्टैक अनविंडिंग समस्या पर जावा और सी ++

क्या यह सही है? इस मुद्दे पर जावा और सी ++ के बीच क्या अंतर है? दूसरे शब्दों में, स्टैक अनचाहे मुद्दे के मामले में इन दोनों भाषाओं में से कौन सा बेहतर माना जाता है? :)

+3

विषय-वस्तु - "बेहतर" परिभाषित करें। – razlebe

+0

जावा एक उचित कचरा कलेक्टर लागू करता है, इसलिए सिद्धांत रूप में, आपको किसी ऑब्जेक्ट के बारे में चिंता करने की ज़रूरत नहीं है जिसे वह स्टैक पर बनाता है। सी ++ मान लें कि आप सावधान रह रहे हैं। – thecoshman

+4

जावा _memory_ कचरा कलेक्टर लागू करता है। अस्थायी फ़ाइलें कचरा नहीं एकत्र की जाती हैं, और परिणामस्वरूप एक स्टैक द्वारा लीक हो सकती है। दूसरी तरफ, सी ++ में अनावश्यक कॉल विनाशकों में, जो मेमोरी क्लीनअप के अलावा अस्थायी फ़ाइलों और अन्य संसाधनों को भी साफ कर सकते हैं। तो जावा आसान है और सी ++ अधिक लचीला, एक मानक इंजीनियरिंग ट्रेडऑफ। – MSalters

उत्तर

5

अवांछित ढेर विशेष रूप से कॉल श्रृंखला तक सभी पूरी तरह से निर्मित वस्तुओं के विनाशकों को बुलाता है जहां अपवाद पकड़ा जाता है।

जावा में कोई स्टैक अनचाहे नहीं है - अगर कोई अपवाद फेंक दिया जाता है तो यह वस्तुओं के लिए कुछ भी नहीं करता है। आपको वस्तुओं को catch और finally ब्लॉक में स्वयं को संभालना होगा। यह मुख्य रूप से सी # ने using statements पेश किया - वे आईडीआईस्पोज़ेबल कॉलिंग को सरल बनाते हैं।(), लेकिन फिर से यह सी ++ स्टैक को अनदेखा करने के लिए पूर्ण प्रतिस्थापन नहीं है।

+0

यहां प्रश्न पूछने के लिए बेहतर हो सकता है: जावा में तंत्र की तरह विनाशक क्यों नहीं है जिसे कचरा कलेक्टर ऑब्जेक्ट एकत्र करता है? इस तरह, हम अपने संसाधनों को बंद करने की गारंटी देंगे; कोई फर्क नहीं पड़ता, क्योंकि हम मेमोरी लीक को संभालने में अधिक रुचि रखते हैं। – Feyyaz

2

आप काफी सही हैं, सी ++ रिवर्स ऑर्डर में सभी स्थानीय चर को नष्ट कर देता है, क्योंकि यह स्टैक पर प्रत्येक फ़ंक्शन से बाहर निकलता है - जैसे कि आप प्रोग्रामेटिक रूप से रिटर्न निष्पादित कर रहे थे - और main() से बाहर।

9

मैं इस के लिए flamed करने के लिए जा रहा हूँ लेकिन ...

सी ++ हाथ नीचे ढेर सामने तनाव मुक्त पर जावा से बेहतर है - वहाँ बस कोई प्रतियोगिता है। सी ++ ऑब्जेक्ट डिस्ट्रक्टर्स कैच पॉइंट तक पहुंचने तक सभी तरह से स्टैक का बैक अप लेते हैं - सभी प्रबंधित संसाधनों को गहन तरीके से जारी करते हैं।

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

उस ने कहा, सी ++ में, स्टैक अनचाहे तंत्र केवल ठीक से काम करता है यदि आप यह सुनिश्चित करने के लिए सावधान हैं कि विनाशक स्वयं अपवाद नहीं छोड़ते हैं। एक बार आपके पास दो सक्रिय अपवाद हो जाने के बाद, आपका प्रोग्राम abort() बिना गुजरने के (और निश्चित रूप से शेष विनाशकों को फायर किए बिना)।

+0

सी ++ में स्टैक पर बनाए गए ऑब्जेक्ट्स को विनाशक कहा जाता है, लेकिन यह ढेर पर ऑब्जेक्ट्स के लिए नहीं होता है, जो एक स्थानीय चर के साथ एक सूचक द्वारा संदर्भित होता है। – Mnementh

+1

@Mnementh: ढेर ऑब्जेक्ट्स को छोड़कर जो एक विनाशक के साथ किसी वस्तु द्वारा उचित रूप से स्वामित्व में हैं। – quamrana

+0

@quamrana: हाँ, जैसा कि मैंने अपने जवाब में बताया है। – Mnementh

2

स्टैक के लिए दोनों समान हैं: वे अपवाद के साथ छोड़े गए ब्लॉक के लिए स्टैक जारी करते हैं। जावा में सभी आदिम प्रकार (int, डबल इत्यादि) सीधे सहेजे जाते हैं, इस प्रकार के स्थानीय चर इस पल में जारी किए जाते हैं। सभी ऑब्जेक्ट्स स्थानीय चरों में संदर्भों के माध्यम से सहेजे जाते हैं, इसलिए संदर्भ हटा दिए जाते हैं, लेकिन ऑब्जेक्ट्स ही ढेर पर रहते हैं। यदि यह ऑब्जेक्ट का अंतिम संदर्भ था, तो उन्हें अगले कचरा संग्रह पर रिलीज़ किया जाता है। यदि सी ++ में ढेर पर बनाए गए ऑब्जेक्ट्स हैं और स्थानीय चर एक पॉइंटर रखते हैं, तो ढेर पर ऑब्जेक्ट्स स्वचालित रूप से रिलीज़ नहीं होते हैं, वे हमेशा के लिए ढेर पर रहते हैं (हाँ, आपको मेमरी लीक मिलती है)। यदि आपने स्टैक पर ऑब्जेक्ट्स को सेव किया है, तो विनाशक को बुलाया जाता है (और ढेर पर अन्य संदर्भित वस्तुओं को छोड़ सकता है)।

+2

सच है, लेकिन सी ++ में स्मार्ट पॉइंटर्स आपको स्वचालित रूप से ढेर-आवंटित वस्तुओं को भी नष्ट कर देते हैं। – sharptooth

+0

सही, स्मार्ट पॉइंटर्स अलग काम करते हैं। – Mnementh

+2

वास्तव में वे बिल्कुल वैसे ही काम करते हैं। अपने विनाशकों और उनके विनाशकों को अनचाहे कॉलों को ढेर करना बदले में इसी ढेर-आवंटित वस्तुओं को नष्ट कर देता है। – sharptooth

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