2012-10-04 24 views
6

में कन्स्ट्रक्टर से अपवाद फेंक दिया गया है, तो मुझे साक्षात्कार में इस प्रश्न का सामना करने से कुछ दिन पहले। तो बस मुझे मार्गदर्शन करें।प्रारंभिक संसाधनों को कैसे साफ करें यदि सी ++

प्रारंभिक संसाधनों को कैसे साफ किया जाए यदि सी ++ में कन्स्ट्रक्टर से अपवाद फेंक दिया गया हो?

+0

यह क्यों बंद किया जा रहा है? यह एक मान्य क्यू है। वोट मत बंद करें क्यू क्योंकि आप इसे पसंद नहीं करते हैं या इसे समझ में नहीं आते हैं। केवल इसे वोट दें और केवल तभी जब यह एसओ पॉलिसी के अनुसार बंद होने के योग्य हो। –

उत्तर

6

चाल का प्रबंधन संसाधनों का प्रबंधन करने के लिए RAII (संसाधन अधिग्रहण प्रारंभ है) का उपयोग करना है।

यदि आपके पास पॉइंटर सदस्य हैं तो कच्चे पॉइंटर्स के बजाय स्मार्ट पॉइंटर्स का उपयोग करें जो एक बार अपवाद को कन्स्ट्रक्टर से फेंकने के बाद स्वचालित रूप से सफाई कार्य करेगा।

अच्छा पढ़ें:
Herb Sutter's excellent GotW article "Construction Failures"

+0

लिंक – Dialecticus

1

डेटा का उपयोग सदस्यों को बताया कि संसाधनों मुक्त कर जब वे नष्ट कर रहे हैं (उर्फ आरए II)।

उदाहरण के लिए:

struct TwoStrings { 
    std::string string1; 
    std::string string2; 
    TwoStrings(const std::string &input) : string1(input) { 
     if (!input[1] == ':') { 
      throw std::logic_error('not a Windows absolute path'); 
      // yes, absolute paths can begin \\, this is a toy example 
     } 
     if (input.back() == '\\') { 
      string2 = input; 
     } else { 
      string2 = input + "\\"; 
     } 
    } 
}; 

निर्माता फेंकता है तो (या तो logic_error या bad_alloc), तो पहले से ही प्रारंभ डेटा सदस्य string1 नष्ट हो जाता है, संसाधन मुक्त हो गया। उस मामले के लिए string2 भी नष्ट हो गया है, लेकिन अगर निर्माता फेंकता है तो string2 अभी भी खाली होना चाहिए, इसलिए इसका कोई विशेष प्रभाव नहीं है।

string संसाधनों का प्रबंधन करने वाली कक्षा का एक उदाहरण है, लेकिन कई अन्य हैं। उनमें से सबसे लचीला "स्मार्ट पॉइंटर्स" कहा जाता है, और इसे किसी भी संसाधन को प्रबंधित करने के लिए कॉन्फ़िगर किया जा सकता है, न कि केवल string जैसे अक्षरों के स्वयं आवंटित सरणी।

1

जब एक अपवाद फेंक दिया जाता है तो स्टैक को पकड़ बिंदु तक अनलॉक किया जाता है। परिणामस्वरूप सब कुछ बनाया गया था इसे नष्ट कर दिया गया है।

बिंदु, इसलिए, प्रत्येक समझदार संसाधन को उस वर्ग में लपेटें जिसका विनाशक संबंधित संसाधनों का निपटान करने का ख्याल रखता है।

यदि संसाधन एक ढेर आवंटित वस्तु है, तो स्मार्ट पॉइंटर्स ठीक उसी तरह करते हैं (थैयर विनाश पर बिंदु वस्तु को हटाएं), अगर संसाधन एक खुली फ़ाइल है तो एक धारा विनाश पर बंद हो जाती है। बाकी सब कुछ एक कस्टम रैपर की आवश्यकता है।

लेकिन ध्यान दें कि कई "संसाधन" हैंडलर द्वारा प्रतिनिधित्व किए जाते हैं जो themselve शून्य * हैं। यह आवंटित resoure के साथ शुरू करने और एक हटाने समारोह को निर्दिष्ट करके, स्मार्ट poitner भी उपयोग करने में सक्षम बनाता है।

तकनीक क्या बेहतर खेलती है स्वाद और अवसर की बात अधिक है।

1

ऐसा करने का सबसे अच्छा तरीका है: रचनाकारों में किसी भी संसाधन आवंटित करें और विनाशकों में किसी को भी रोक दें।

सी ++ में टेम्पलेट्स इस उद्देश्य के लिए बहुत उपयोगी हैं क्योंकि हम वस्तु निर्माण परमाणु बना सकते हैं।

+0

के लिए +1 आपको उदाहरणों और कुछ और स्पष्टीकरण के साथ आने की आवश्यकता है क्योंकि आप देखते हैं कि इस प्रश्न का पहले ही कुछ जवाब दिया गया है। –