2012-01-09 16 views
5

मैं निम्नलिखित कोड:स्कोप और C++ संकेत

using namespace std; 
vector<string*> v; 
{ 
    string s = "hello"; 
    v.push_back(&s); 
} 
{ 
    string ss = "goodbye"; 
    v.push_back(&ss); 
} 

cout << v.at(0)->c_str() << endl; 
cout << v.at(1)->c_str() << endl; 

जो

goodbye 
goodbye 

प्रिंट अगर मैं हटाने गुंजाइश वाले कोष्ठक कोड

hello 
goodbye 

प्रिंट होगा क्या वास्तव में जब होता है मैं पहला गुंजाइश छोड़ देता हूं, कि पहली स्ट्रिंग के सूचक अब दूसरे को इंगित करते हैं?

+1

यूबी, ल्यूक! यह सिर्फ यूबी है। आप भाग्यशाली हो गए कि आपका कंप्यूटर विस्फोट नहीं हुआ। –

+1

क्या मैं आपको इस प्रश्न के अब प्रसिद्ध उत्तर में देख सकता हूं: http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – Benj

+0

युप, [क्रॉसिंग धाराएं] (http://en.wikipedia.org/wiki/Proton_pack#Crossing_the_Streams) फिर से। –

उत्तर

7

संग्रहीत पॉइंटर्स दायरे के बाद लटकने वाले पॉइंटर्स बन जाते हैं और वे जो भी इंगित करते हैं उसे पढ़ने के लिए किसी भी प्रयास को अपरिभाषित व्यवहार उत्पन्न करते हैं।

+0

जो मैंने सोचा था, लेकिन तथ्य यह था कि परिणाम निरंतर थे, मुझे पूछना पड़ा। – Bg1987

+2

अपरिभाषित व्यवहार का मतलब है कि कुछ भी हो सकता है, जिसमें सामान्य दिखने, लगातार परिणाम शामिल हैं। अपरिभाषित व्यवहार इतने खराब कारणों में से एक है; जब आप कोई प्रोग्राम लिखते हैं तो हो सकता है कि आप इसे भी ध्यान न दें, लेकिन आपका प्रोग्राम कुछ अन्य परिस्थितियों में विनाशकारी रूप से विफल हो सकता है। – bames53

+0

@ बीजी 1 9 87: अपरिभाषित व्यवहार का मतलब यादृच्छिक व्यवहार नहीं है। सच यादृच्छिकता वास्तव में अस्तित्व में नहीं है :) इसका मतलब है कि क्या होगा किसी भी नियम (मानक बिंदु से) से बंधे नहीं है, लेकिन संकलक का आउटपुट अभी भी कंपाइलर के कोड उत्पादन नियमों से बंधे हैं, इसलिए सीमा व्यवहार प्रदान कर सकते हैं सीमित है। –

3

क्या होता है एक अपरिभाषित व्यवहार होता है, क्योंकि s उस समय से बाहर है जब आपने इसे cout<< ऑपरेटर पर कॉल में संदर्भित किया था।

यह दुर्घटना नहीं करता है क्योंकि s और ssअपने विशिष्ट वास्तुकला के साथ एक ही पते और सी ++ के कार्यान्वयन के लिए होता है। दूसरे शब्दों में, अन्य जो अन्य आर्किटेक्चर या अन्य कंपाइलर्स के साथ आपके प्रयोग को दोहराने का प्रयास करते हैं, उन्हें शायद अलग-अलग परिणाम मिलेंगे।

2

आप दो ऑब्जेक्ट्स को दो ऑब्जेक्ट्स को संदर्भित कर रहे हैं जो नष्ट हो गए हैं: यह अपरिभाषित व्यवहार है। कुछ भी यहां हो सकता है।

+0

पॉइंटर्स कुछ अमान्य स्थान को इंगित करते हैं, अपरिभाषित व्यवहार नहीं है; उन्हें हटाना –

+0

@phresnel है, हाँ। संपादित। – hmjd

3

प्रैक्टिस में सिस्टम स्ट्रिंग एसएस को पकड़ने के लिए स्ट्रिंग एस के लिए उपयोग की जाने वाली मेमोरी का पुन: उपयोग कर रहा है। लेकिन यह ऐसा होता है कि संकलक स्मृति का प्रबंधन कैसे कर रहा है; सी ++ मानक के अनुसार आप इस तरह के किसी भी व्यवहार पर भरोसा नहीं कर सकते हैं और आपके द्वारा पोस्ट किए गए कोड का वास्तविक परिणाम अपरिभाषित है।

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