2010-02-03 22 views
12

मान लीजिए मैं निम्नलिखित snipplet हैसी ++ नाशक और समारोह कॉल आदेश

Foo foo; 
.... 
return bar(); 

अब,() से पहले foo :: ~ फू() कहा जाएगा सी ++ मानक मुझे उस बार की गारंटी देता है करता है? या यह संकलक/कार्यान्वयन की पसंद है?

धन्यवाद!

+0

इस विषय पर आपकी सी ++ पाठ्य पुस्तक को क्या कहना है? –

+2

इस पुस्तक की आप क्या बात करते हैं? क्या यह ढेर अतिप्रवाह की तरह है, लेकिन संपादित, और कागज पर डाल दिया? – anon

उत्तर

15

यह गारंटीकृत व्यवहार है।

  • क्या प्रोग्राम निष्पादन की गारंटी देता है, आम तौर पर

1,9 कार्यक्रम निष्पादन

:

0: enter block (scope) 
1: Foo::Foo() 
2. evaluation of bar(); as expression in return statement 
3. save result of the expression as value returned from function 
4. finalize return statement to leave function to its caller (request exit from current scope) 
5: exit block (scope) with call to Foo::~Foo() 

यहां मानक से कुछ संदर्भों हैं: वास्तविक निष्पादन इस प्रकार unrolled है 10 स्वचालित संग्रहण अवधि (3.7.2) के साथ प्रत्येक ऑब्जेक्ट का एक उदाहरणहैप्रत्येक प्रविष्टि से ब्लॉक में जुड़ा हुआ है।

  • foo स्वत: भंडारण की अवधि का है और:

3.7.2 स्वत: भंडारण अवधि

1 स्थानीय वस्तुओं को स्पष्ट रूप से ऑटो घोषित या पंजीकृत या स्पष्ट रूप से स्थिर घोषित नहीं या बाहरी में स्वचालित भंडारण अवधि होती है। के लिए भंडारण ये ऑब्जेक्ट्स उस ब्लॉक तक रहता है जिसमें उन्हें निकास बनाया जाता है।

  • वापसी कथन की वास्तविक प्रभाव क्या है

6.6.3 वापसी कथन

2 (...) अभिव्यक्ति के मूल्य के फोन करने वाले को लौट गया फ़ंक्शन

और

6.6 कूद बयान (वापसी बयान कूद के अंतर्गत आता है)

2 एक दायरे से बाहर निकलने पर (हालांकि पूरा किया), विनाशकर्ता (12.4) स्वत: भंडारण अवधि के साथ सभी निर्माण वस्तुओं के लिए कहा जाता है (3.7.2)

  • क्या गारंटी देता है कि प्रभाव होता है

6.7 घोषणा बयान

स्वत: भंडारण अवधि ब्लॉक में घोषित के साथ 2 चर ब्लॉक से बाहर निकलने पर नष्ट कर रहे हैं

और

12,4 Destructors

10 Destructors लागू कर रहे हैं स्थिर भंडारण अवधि (3.7.1) के साथ निर्मित ऑब्जेक्ट के लिए अंतर्निहित (1) कार्यक्रम समाप्ति (3.6.3), (2) स्वत: भंडारण अवधि (3.7.2) जब ब्लॉक जिसमें वस्तु बाहर निकलता है (6,7)

बनाई गई है के साथ एक निर्माण वस्तु के लिए ऐसा नहीं है सभी सी ++ मानक के चारों ओर बिखरे हुए एकल विचार फ़ॉर्म विवरण को समझना आसान है। उम्मीद है कि त्वरित अवलोकन आपको इस तरह के विश्लेषण को भी स्वयं करने में मदद करेगा।

7

हाँ, बार() को foo के विनाशक के समक्ष बुलाया जाएगा।

मानक का कहना है: 6.6: "एक गुंजाइश (हालांकि पूरा किया) से बाहर निकलने पर, विनाशकर्ता (12.4) हैं स्वत: भंडारण अवधि (3.7.2) (नामित वस्तुओं या temporaries) के साथ सभी का निर्माण वस्तुओं के लिए कहा जाता है कि उनकी घोषणा के विपरीत क्रम में उस दायरे में घोषित किया गया है। "

रिटर्न स्टेटमेंट पूरा होने तक दायरा नहीं छोड़ा गया है।

5

कॉलिंग बार() के परिणाम का मूल्यांकन किया जाना चाहिए जिसमें फू को साफ किया जा सकता है, इसलिए हाँ, बार() को Foo :: ~ Foo() से पहले बुलाया जाएगा।

3

ऑब्जेक्ट्स गुंजाइश छोड़ते समय नष्ट हो जाते हैं।

return दायरा छोड़ देता है, लेकिन यह bar() निष्पादित होने तक वापस नहीं आ सकता है। Ergo, bar() कहा जाता है।

2

बस सोचें, क्या होगा यदि यह return bar(foo); था? यह सिर्फ में काम करने के लिए है, और यदि आप तर्क के रूप में पास करते हैं या नहीं, तो यह विनाश आदेश अलग था या नहीं।

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