कोड का निम्न भाग संकलित करता है तथा त्रुटियों के बिना और उम्मीद उत्पादन के साथ चलाता है के साथ समारोह के लिए एक स्थानीय सी-स्ट्रिंग लौटाएं? आम तौर पर यदि आप एक सी-स्ट्रिंग लौटाते हैं जिसे स्थानीय रूप से घोषित किया गया था तो आप कुछ अपरिभाषित व्यवहार में भाग सकते हैं, लेकिन इस मामले में यह अभी भी एक समस्या है क्योंकि यह स्ट्रिंग कन्स्ट्रक्टर के माध्यम से चलाया जाता है और (अनुमानतः) गतिशील स्मृति में कॉपी किया जाता है?सी ++ स्ट्रिंग वापसी मान
उत्तर
return s;
कि लाइन के बराबर है:
return std::string(s);
और वह एक कॉपी स्ट्रिंग के देगा है, इसलिए यह ठीक है।
संदर्भ:http://en.cppreference.com/w/cpp/string/basic_string/basic_string (निर्माता # 5)
Constructs अशक्त-समाप्त चरित्र स्ट्रिंग की एक प्रति के साथ प्रारंभ साथ सामग्री स्ट्रिंग द्वारा की ओर इशारा किया।
संपादित करें: एक और विवरण। आप
गतिशील स्मृति में प्रतिलिपि का उल्लेख करते हैं?
और उत्तर शायद, शायद, यह वास्तव में कोई फर्क नहीं पड़ता।
std::string
द्वारा प्रदान किए गए अर्थशास्त्र इस दिशा में कोई विनिर्देश नहीं देते हैं, यह गारंटी देता है कि इसे प्रतिलिपि/स्थानांतरित किया जा सकता है और एक सतत मामले में उपयोग किया जा सकता है। यह लाइब्रेरी कार्यान्वयन पर निर्भर करता है।
वास्तव में, के std::string
उपयोग कुछ लोकप्रिय कार्यान्वयन "एस मॉल एस tring हे ptimization" कहा जाता है। जहां एक निश्चित लंबाई के नीचे तार स्ट्रिंग ऑब्जेक्ट के भीतर ही संग्रहीत होते हैं।
पर बनाया गया अस्थायी 'std :: string' ऑब्जेक्ट जो वापस किया गया है, सरणी 's से बनाया गया है (प्रतिलिपि नहीं!)। – Buster
मुझे लगता है कि आप गलत व्याख्या कर रहे हैं, 'std :: string' का निर्माता 's' द्वारा इंगित स्ट्रिंग की सामग्री की प्रतिलिपि बनाता है। 's' अभी भी एक स्ट्रिंग है, एक सी स्ट्रिंग है, लेकिन फिर भी एक स्ट्रिंग है। – Frank
हां, पर्याप्त मेला। इस बात से इनकार नहीं किया जाता है कि "स्ट्रिंग का _copy_" बनाया गया है, इस अर्थ में कि स्ट्रिंग के बाइट की प्रतिलिपि बनाई जाएगी। – Buster
- 1. स्ट्रिंग या स्ट्रिंगबिल्डर वापसी मान?
- 2. वापसी मान
- 3. strcpy() वापसी मान
- 4. वापसी मान
- 5. बदलने वापसी मान
- 6. "sys.getrefcount()" वापसी मान
- 7. डीबग वापसी मान
- 8. सी ++ वापसी मान अनुकूलन, कई अज्ञात रिटर्न
- 9. देखें वापसी मान
- 10. setInterval/setTimeout वापसी मान
- 11. uint32_t नाशक वापसी मान
- 12. अजाक्स पद वापसी मान
- 13. वापसी मान cProfile
- 14. वापसी मान स्क्रिप्ट
- 15. SignalR समारोह वापसी मान
- 16. वापसी मान एक ब्लॉक
- 17. iphone - वापसी मान
- 18. वापसी मान जावा धागे
- 19. document.getElementById() मान वापसी क्रोम
- 20. Clojure स्ट्रिंग वापसी
- 21. डैप्पर - एक ही वापसी मान
- 22. सी # WebBrowser नियंत्रण में जावास्क्रिप्ट से वापसी मान रही WPF
- 23. क्यों स्ट्रिंग। लम्बाई वापसी अपरिभाषित?
- 24. स्ट्रिंग वापसी समारोह
- 25. ग्रहण/जावा - आरस्ट्रिंग में मान। * वापसी int?
- 26. स्विफ्ट वापसी मान सकते हैं?
- 27. EasyMock औरReturn() शून्य वापसी मान
- 28. वापसी मान अनुकूलन std :: टपल
- 29. वापसी सी ++ सरणी सी #
- 30. ऑब्जेक्टिव-सी वापसी मान के रूप में ब्लॉक प्रकार
मानक लाइब्रेरी में जोड़ा गया 'std :: string' मुख्य कारणों में से एक - इसे' int' और 'double' जैसे एम्बेडेड प्रकार के रूप में उपयोग किया जा सकता है, इसलिए हाँ' std :: string' को वापस करना ठीक है मूल्य। – Slava
क्या आप जानते थे कि स्ट्रिंग लिटरल में स्थिर भंडारण अवधि है: [cpp-ref] (http://en.cppreference.com/w/cpp/language/string_literal)। तो यदि आपका सी-स्ट्रिंग सिर्फ 'const char * s = "हैलो वर्ल्ड" जैसे स्ट्रिंग लिट्रल को इंगित करता है, तो आप इसे अपने फ़ंक्शन से सुरक्षित रूप से वापस कर सकते हैं, क्योंकि एस स्थिर संग्रहण अवधि वाले ऑब्जेक्ट के लिए पॉइंटर है। यही कारण है कि 'std :: को छोड़कर :: क्या()' या 'type_info :: name()' एक सी-स्ट्रिंग – Oliv
@ ओलिव लौटता है यह एक साफ तथ्य है लेकिन यह सिर्फ एक उदाहरण है, मेरे असली प्रोग्राम में सी स्ट्रिंग है रनटाइम –