2012-02-15 18 views
5

आदेश तर्क an answer I gave recently की टिप्पणियों में चल रहा स्टेम करने के लिए, मैं कुछ रचनात्मक जवाब निम्न प्रश्नों करना चाहते हैं:अपने लक्ष्य के संबंध में एक संदर्भ के जीवनकाल

  1. एक संदर्भ के विशिष्ट जीवन है वस्तु से यह संदर्भित करता है? क्या संदर्भ केवल इसके लक्ष्य के लिए एक उपनाम है?
  2. क्या कोई संदर्भ एक सुव्यवस्थित कार्यक्रम में अपने लक्ष्य को पार कर सकता है जिसके परिणामस्वरूप अपरिभाषित व्यवहार होता है?
  3. क्या किसी ऑब्जेक्ट को मूल ऑब्जेक्ट के लिए आवंटित संग्रहण का पुन: उपयोग किया जा सकता है?
  4. क्या निम्न कोड उपरोक्त बिंदुओं को बिना अपरिभाषित व्यवहार का आविष्कार किए दिखाता है?

उदाहरण Ben Voigt और सरल (ideone.com पर चला) द्वारा कोड:

#include <iostream> 
#include <new> 

struct something 
{ 
    int i; 
}; 

int main(void) 
{ 
    char buffer[sizeof (something) + 40]; 
    something* p = new (buffer) something; 
    p->i = 11; 
    int& outlives = p->i; 
    std::cout << outlives << "\n"; 
    p->~something(); // p->i dies with its parent object 
    new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done 
    new (&outlives) int(13); 
    std::cout << outlives << "\n"; // but reference is still alive and well 
            // and useful, because strict aliasing was respected 
} 
+0

यह एक बहुत सारे प्रश्न हैं, प्रत्येक को उचित रूप से उत्तर देने के लिए कुछ मानक शब्द उद्धरणों की आवश्यकता होती है (प्रश्न की प्रकृति को देखते हुए मुझे लगता है कि आप मानक कोट्स को उचित उत्तरों के रूप में उम्मीद करते हैं)। यदि हम उनमें से किसी एक पर ध्यान केंद्रित करना चाहते हैं तो यह/अधिक उपयोगी हो सकता है, और यदि उस संदर्भ में उपयोगी है तो केवल दूसरों का जवाब दें ... – PlasmaHH

+0

मैं सहमत हूं। कृपया, प्रति प्रश्न एक प्रश्न। और आप पाएंगे कि उपधाराओं का उत्तर पहले दिया गया है। –

+0

इसके अलावा, वह कोड नमूना बहुत अधिक चल रहा है। एक छोटा टेस्टकेस बनाओ। –

उत्तर

9

एक संदर्भ के जीवनकाल वस्तु यह को संदर्भित करता है से अलग है? क्या संदर्भ केवल इसके लक्ष्य के लिए एक उपनाम है?

int x = 0; 
{ 
    int& r = x; 
}  // r dies now 
x = 5; // x is still alive 

एक रेफरी-हैं- const अतिरिक्त अपने रेफरी के जीवन का विस्तार हो सकता है::

int foo() { return 0; } 
const int& r = foo(); // note, this is *not* a reference to a local variable 
cout << r;    // valid; the lifetime of the result of foo() is extended 

हालांकि इस चेतावनियां के बिना नहीं है:

एक संदर्भ का अपना जीवन है

केवल संदर्भ का संदर्भ केवल जीवन भर में फैलाता है एफ एक अस्थायी वस्तु है यदि संदर्भ ए है) स्थानीय और बी) एक ऐसे प्रसार से बंधे जिसका मूल्यांकन अस्थायी वस्तु कहता है। (इसलिए यह सदस्यों, या स्थानीय संदर्भों के लिए काम नहीं करता है जो xvalues ​​के लिए बाध्य हैं।) इसके अलावा, गैर-कॉन्स रावल संदर्भ संदर्भ जीवन भर को उसी फैशन में बढ़ाते हैं। [@FredOverflow]


एक संदर्भ अपने लक्ष्य एक अच्छी तरह से गठित कार्यक्रम में अपरिभाषित व्यवहार के परिणाम के बिना से अधिक जीवित कर सकते हैं?

निश्चित रूप से, जब तक आप इसका उपयोग नहीं करते हैं।


एक संदर्भ है, तो भंडारण मूल वस्तु के लिए आवंटित पुन: उपयोग किया जाता है एक नई वस्तु का उल्लेख करने के लिए किया जा सकता है?

हां, कुछ शर्तों के तहत:

[C++11: 3.8/7]: हैं, के बाद एक वस्तु का जीवन समाप्त हो गया है और भंडारण जो वस्तु पर कब्जा कर लिया पुन: उपयोग या जारी किया गया है से पहले, एक नई वस्तु भंडारण पर बनाया गया है मूल वस्तु पर कब्जा करने वाला स्थान, मूल ऑब्जेक्ट को इंगित करने वाला एक सूचक, मूल ऑब्जेक्ट को संदर्भित संदर्भ या मूल ऑब्जेक्ट का नाम स्वचालित रूप से नई ऑब्जेक्ट को संदर्भित करेगा और, एक बार जब नई ऑब्जेक्ट का जीवनकाल हो शुरू किया गया, नए ऑब्जेक्ट में हेरफेर करने के लिए इस्तेमाल किया जा सकता है, यदि:

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

निम्नलिखित कोड अपरिभाषित व्यवहार लागू बिना ऊपर अंक प्रदर्शित करता है?

टीएल; डॉ।

+0

संदर्भ के लिए केवल एक अस्थायी वस्तु के जीवनकाल को विस्तारित करता है यदि संदर्भ एक है) स्थानीय और बी) एक ऐसे प्रसार से बंधे जिसका मूल्यांकन अस्थायी वस्तु कहता है। (इसलिए यह सदस्यों, या स्थानीय संदर्भों के लिए काम नहीं करता है जो xvalues ​​के लिए बाध्य हैं।) इसके अलावा, गैर-कॉन्स रावल संदर्भ संदर्भ जीवन भर को उसी फैशन में बढ़ाते हैं। – fredoverflow

+0

@FredOverflow: ता! –

5
  1. हां। उदाहरण के लिए स्थानीय नॉनस्टैटिक संदर्भों में स्वचालित संग्रहण अवधि और संबंधित लीफटाइम होती है और उन ऑब्जेक्ट्स का उल्लेख कर सकती है जिनमें लंबे जीवनकाल होते हैं।

  2. हां, संदर्भों को लटकाना एक उदाहरण है। जब तक वे किसी भी अभिव्यक्ति में ऐसे संदर्भों का उपयोग नहीं करते हैं जब वे लटकते हैं, तो वे ठीक होते हैं।

  3. इस मामले के बारे में खंड 3 में एक विशेष नियम है। ऑब्जेक्ट्स, पॉइंटर्स और संदर्भों के नाम स्वचालित रूप से उस नई ऑब्जेक्ट को संदर्भित करते हैं जो प्रतिबंधित स्थितियों के तहत संग्रहण का पुन: उपयोग करता है। मेरा मानना ​​है कि यह 3.8 के अंत में है। कोई व्यक्ति जिसकी कल्पना आसान है कृपया यहां सही रेफरी भरें।