2013-06-11 7 views
9

का संदर्भ देता है मैंने एक फ़ंक्शन लिखा है जो स्थानीय ऑब्जेक्ट का संदर्भ देता है।फ़ंक्शन जो स्थानीय ऑब्जेक्ट

Fraction& operator*(Fraction& lhs, Fraction& rhs) 
{ 
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den); 
    return res; 
} 

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

संकलक समय की संकलन के रूप में इस तरह की स्थिति का पता नहीं लगा सकता है?

+13

आम तौर पर यह कर सकता है - g ++ कुछ चेतावनी जैसे 'चेतावनी: स्थानीय चर के संदर्भ' x 'वापस लौटा [डिफ़ॉल्ट रूप से सक्षम] '। यह आपके द्वारा उपयोग किए जा रहे कंपाइलर और/या आपके द्वारा उपयोग किए गए कंपाइलर स्विच पर निर्भर हो सकता है। –

+2

यही चेतावनी है कि सभी चेतावनियों को त्रुटि के रूप में समझने का समय है। – yngccc

+0

ध्यान दें कि आप निरंतर संदर्भ से वापस आ सकते हैं और यह ठीक होगा – dchhetri

उत्तर

19

अधिकांश कंपाइलर एक चेतावनी दिखाएंगे जब आप ऐसा करेंगे। आपको हमेशा GCC के -Wall जैसे विकल्प के साथ चेतावनियां चालू करनी चाहिए।

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

+0

क्या आप पॉइंटर अंकगणितीय/सृजन के बिना ऐसी "हार्ड टू बताना" स्थिति के लिए उदाहरण दे सकते हैं? – Elazar

+8

@Elazar Sure, 'वापसी fn (local_var); 'फ़ंक्शन इसके तर्क का संदर्भ वापस कर सकता है, जो एक स्थानीय चर है। या 'टी और रेफरी = ध्वज? स्थानीय: वैश्विक; 'और बाद में' रिटर्न रेफ; '। फिर संकलक को यह साबित करना होगा कि फ़ंक्शन लौटाता है (अपवाद द्वारा बाहर निकलने के विपरीत) केवल तभी 'ध्वज'' गलत था। – Potatoswatter

+0

मुझे लगता है कि संकलक को सशर्त अभिव्यक्ति को इंगित करने वाले 'रिटर्न रेफरी' के लिए चेतावनी उत्सर्जित करनी चाहिए। यह एक "मई" विश्लेषण है। 'वापसी एफएन (स्थानीय) 'एक अलग कहानी है, मैं सहमत हूं। – Elazar

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