2012-06-19 5 views
7

उसके व्यावहारिक पत्र में,
Error and Exception Handling,
@Dave Abrahams का कहना है:स्पष्टीकरण अपवाद की डबल विनाश के बारे में आवश्यक वस्तुओं

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

  1. इस डबल विनाश परिदृश्य &
  2. क्या एक कस्टम अपवाद वर्ग को लागू करने के लिए सबसे अच्छा तरीका है की एक कोड उदाहरण प्रदान करें:

मैं नहीं इस विशेष दिशानिर्देश को समझने में सक्षम, किसी को कर रहा हूँ कर सकते हैं इससे बचने के लिए?

+2

[इस धागे] के अनुसार (http://compgroups.net/comp.lang.c++.moderated/exception-objects-to-be-destroyed-twi/104604), यह संकलक में एक बग है जो डबल का कारण बनता है विनाश। – chrisaycock

+2

@chrisaycock: ओह, मैंने पोस्ट करने से पहले इस पर एक Google खोज नहीं की, मैंने सोचा कि शायद मेरा संदेह बहुत विशिष्ट या छोटा था कि किसी को भी यही संदेह होगा। जो मुझे एक और प्रश्न लाता है *** क्या यह दिशानिर्देश अभी भी है प्रासंगिक? *** –

उत्तर

5

@ टोनी की तरह, यह दिशानिर्देश कंपाइलर कीड़े के खिलाफ सुरक्षा के रूप में था। यह दिशानिर्देश 2001 या उससे भी पहले की तारीख है, जब अपवाद समर्थन शायद थोड़ा अस्थिर था। तब से, मुझे लगता है/उम्मीद है कि अधिकांश कंपेलरों ने इस बग को ठीक कर दिया है, इसलिए दिशानिर्देश अब और अधिक प्रासंगिक नहीं हो सकता है।

एफडब्ल्यूआईडब्ल्यू, यह दिशानिर्देश the CERT coding practices से हटा दिया गया है। इस पृष्ठ पर चर्चा में, एक दिलचस्प बिंदु उठाया गया है: किसी वस्तु को दो बार नष्ट करना यूबी है, इसलिए जो कुछ भी आप अपने वर्गों में संभालने के लिए करते हैं, वह कभी भी आपके कार्यक्रम को पूरी तरह पूर्वानुमानित नहीं करेगा।

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

चाहे आपका कोड लिखते समय आपको वही देखभाल करने की आवश्यकता हो, आपकी आवश्यकताओं पर निर्भर करता है, और मूल रूप से इस प्रश्न पर उबाल जाता है: दर्जनों कंपाइलर्स का समर्थन वास्तव में काम की मात्रा के लायक है?

3

@chrisaycock द्वारा अनुच्छेद से उद्धृत करने के लिए:

"क्यों दो बार नष्ट"? कंपाइलर कीड़े के कारण, यही कारण है कि! यह त्रुटि है, संकलक इसे नहीं करना चाहिए। लेकिन वे करते हैं। मैंने प्रोजेक्ट पर काम किया जहां मैंने सूर्य के स्टूडियो 8 कंपाइलर का उपयोग करके इसकाट लिया। I ने एक पकड़ खंड में एक ostringstream ऑब्जेक्ट बनाया और पाया कि इसे दो बार नष्ट कर दिया गया है। इसे ठीक करने के लिए मैंने कोशिश करने से पहले इसे स्थानांतरित कर दिया, फिर यह काम किया। इस तरह की बग अक्सर नहीं होती है। अधिकांश समय कैच क्लॉज में ऑब्जेक्ट्स बनाना ठीक था, लेकिन यह के बारे में पता होना चाहिए।

सादर,

एंड्रयू मार्लो

+0

मुझे कई प्रश्न उठाते हैं: *** "क्या यह दिशानिर्देश अभी भी प्रासंगिक है?" ***, *** "क्या मुझे जो कोड लिखता है वह खाता कंपाइलर बग में भी लेना चाहिए?" ***। मानक पालन करने वाले मानक यूबी मुक्त कोड को लिखना मुश्किल है, क्या मुझे इन सभी चीजों का भी ख्याल रखना चाहिए? –

+0

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

1

जहां एक वस्तु दो बार विलुप्त हो सकता है स्टैंडर्ड में कोई परिदृश्य नहीं है। कोई भी उदाहरण जहां यह होता है उपयोगकर्ता की तरफ से एक बग है, या जहां ऑब्जेक्ट को कंपाइलर द्वारा अपवाद के रूप में नष्ट किया जाता है, तो कंपाइलर बग। मैंने कभी भी किसी भी बड़े कंपाइलर में ऐसी बग के बारे में कभी नहीं सुना है, और यह मानने का कोई कारण नहीं है कि सामान्य रूप से सी ++ कोड लिखने वाले किसी के लिए यह समस्याग्रस्त होगा।

+0

दरअसल, एक ही ऑब्जेक्ट को दो बार नष्ट करना एक गारंटीकृत अपरिभाषित व्यवहार है और मैंने कभी ऐसा कोई परिदृश्य नहीं देखा है, इसलिए सवाल। + 1 हालांकि उत्तर के लिए धन्यवाद। –

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