2013-04-29 7 views
18

क्या निम्न कार्य C++ 03 या C++ 11 में सुरक्षित है या क्या यह यूबी प्रदर्शित करता है?फ़ंक्शन सुरक्षित के माध्यम से संदर्भ पारित कर रहा है?

string const &min(string const &a, string const &b) { 
    return a < b ? a : b; 
} 

int main() { 
    cout << min("A", "B"); 
} 
  • यह एक वस्तु संदर्भ द्वारा समारोह के लिए पारित करने के लिए एक संदर्भ के लौटने के लिए ठीक है?

  • क्या यह गारंटी है कि अस्थायी string ऑब्जेक्ट बहुत जल्द नष्ट नहीं हुआ है?

  • क्या कोई मौका है कि दिया गया फ़ंक्शन min यूबी प्रदर्शित कर सकता है (यदि यह दिए गए संदर्भ में नहीं है)?

  • क्या प्रतिलिपि बनाने या आगे बढ़ने के दौरान एक समकक्ष, लेकिन सुरक्षित कार्य करना संभव है?

+0

क्या आपको स्टडी स्ट्रिंग के साथ काम करने की ज़रूरत है? यदि आप बिल्कुल अस्थायी से बचना चाहते हैं, तो आप '' std :: strcmp() '' का उपयोग कर सकते हैं। – bluescarni

+0

@bluescarni: इससे कोई फर्क नहीं पड़ता कि 'स्ट्रिंग' या अन्य अस्थायी ऑब्जेक्ट प्रकार है या नहीं। सवाल सामान्य होना है। –

उत्तर

29

क्या संदर्भ के अनुसार कार्य को पारित किसी ऑब्जेक्ट का संदर्भ वापस करना ठीक है?

जब तक कि उस संदर्भ के माध्यम से आप इसे एक्सेस करने से पहले ऑब्जेक्ट नष्ट नहीं हो जाते हैं, हां।

क्या यह गारंटी है कि अस्थायी string ऑब्जेक्ट बहुत जल्द नष्ट नहीं हुआ है?

इस मामले में, हाँ। एक अस्थायी पूर्ण अभिव्यक्ति के अंत तक रहता है जो इसे बनाता है, इसलिए cout पर स्ट्रीम होने के बाद इसे नष्ट नहीं किया जाता है।

क्या कोई मौका है कि दिया गया कार्य मिनट यूबी प्रदर्शित कर सकता है (यदि यह दिए गए संदर्भ में नहीं है)?

auto const & r = min("A", "B"); // r is a reference to one of the temporaries 
cout << r;      // Whoops! Both temporaries have been destroyed 

यह जबकि अभी भी नकल से बचने या चलती एक बराबर है, लेकिन सुरक्षित समारोह बनाने के लिए संभव है:

हाँ, यहाँ एक उदाहरण है?

मुझे ऐसा नहीं लगता है; लेकिन यह फ़ंक्शन तब तक सुरक्षित है जब तक आप इसके परिणाम का संदर्भ न रखें।

+1

मुझे यकीन है कि समकक्ष बनाना असंभव है, क्योंकि इसके लिए एक पूर्ण जीसी की आवश्यकता होगी। आपको ट्रैक करने की आवश्यकता है कि अभी भी अस्थायी वस्तु के संदर्भ हैं या नहीं। – MSalters

+1

फ़ंक्शन स्वयं कुछ भी अनिर्धारित नहीं करता है (लौटाया गया संदर्भ पैराम के रूप में मान्य होगा) ... इसका उपयोग आईएमओ – nishantjr

+0

करता है यदि संकलक को इस मामले में प्रतिलिपि को रोकने की अनुमति दी जाती है तो संकलक को अनुमति दी जाती है। हालांकि, यह आपके कंपाइलर और अनुकूलन स्तर पर निर्भर करता है। जीसीसी, उदाहरण के लिए, '-O2' या इससे अधिक के साथ अस्थायी वापसी मानों की प्रतिलिपि रोक देगा। – Symaxion

2

हाँ, यह सुरक्षित है। "ए" और "बी" दोनों के लिए स्ट्रिंग temps 'अनुक्रम बिंदु' के अंत तक जीवित रहेगा, जो अर्धविराम है।

4

आपका अस्थायी वस्तुओं, यह सुरक्षित है का उपयोग कर के इस रास्ता "जीवित" मुख्य में cout से ; के अंत तक रहना होगा ताकि

1

यह गारंटी है कि अस्थायी स्ट्रिंग वस्तु हाँ अपने विशिष्ट मामले के लिए भी नष्ट नहीं है जल्द ही

है, लेकिन निम्न कोड नहीं

int main() { 
    const string &tempString(min("A", "B")); 
    cout << tempString; 
} 
कि बगल में

मैं सहमत के लिए क्या "माइक Seymour" कहा।

+1

यह होगा कि उस अस्थायी संदर्भ –

+0

के लिए कोई कॉन्स कीवर्ड था, धन्यवाद, यह अब संकलित है और समस्या कहां दिखाती है। –

0

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

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