2017-08-01 14 views
7

कोड का निम्न भाग संकलित करता है तथा त्रुटियों के बिना और उम्मीद उत्पादन के साथ चलाता है के साथ समारोह के लिए एक स्थानीय सी-स्ट्रिंग लौटाएं? आम तौर पर यदि आप एक सी-स्ट्रिंग लौटाते हैं जिसे स्थानीय रूप से घोषित किया गया था तो आप कुछ अपरिभाषित व्यवहार में भाग सकते हैं, लेकिन इस मामले में यह अभी भी एक समस्या है क्योंकि यह स्ट्रिंग कन्स्ट्रक्टर के माध्यम से चलाया जाता है और (अनुमानतः) गतिशील स्मृति में कॉपी किया जाता है?सी ++ स्ट्रिंग वापसी मान

+0

मानक लाइब्रेरी में जोड़ा गया 'std :: string' मुख्य कारणों में से एक - इसे' int' और 'double' जैसे एम्बेडेड प्रकार के रूप में उपयोग किया जा सकता है, इसलिए हाँ' std :: string' को वापस करना ठीक है मूल्य। – Slava

+1

क्या आप जानते थे कि स्ट्रिंग लिटरल में स्थिर भंडारण अवधि है: [cpp-ref] (http://en.cppreference.com/w/cpp/language/string_literal)। तो यदि आपका सी-स्ट्रिंग सिर्फ 'const char * s = "हैलो वर्ल्ड" जैसे स्ट्रिंग लिट्रल को इंगित करता है, तो आप इसे अपने फ़ंक्शन से सुरक्षित रूप से वापस कर सकते हैं, क्योंकि एस स्थिर संग्रहण अवधि वाले ऑब्जेक्ट के लिए पॉइंटर है। यही कारण है कि 'std :: को छोड़कर :: क्या()' या 'type_info :: name()' एक सी-स्ट्रिंग – Oliv

+0

@ ओलिव लौटता है यह एक साफ तथ्य है लेकिन यह सिर्फ एक उदाहरण है, मेरे असली प्रोग्राम में सी स्ट्रिंग है रनटाइम –

उत्तर

12
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" कहा जाता है। जहां एक निश्चित लंबाई के नीचे तार स्ट्रिंग ऑब्जेक्ट के भीतर ही संग्रहीत होते हैं।

+0

पर बनाया गया अस्थायी 'std :: string' ऑब्जेक्ट जो वापस किया गया है, सरणी 's से बनाया गया है (प्रतिलिपि नहीं!)। – Buster

+1

मुझे लगता है कि आप गलत व्याख्या कर रहे हैं, 'std :: string' का निर्माता 's' द्वारा इंगित स्ट्रिंग की सामग्री की प्रतिलिपि बनाता है। 's' अभी भी एक स्ट्रिंग है, एक सी स्ट्रिंग है, लेकिन फिर भी एक स्ट्रिंग है। – Frank

+0

हां, पर्याप्त मेला। इस बात से इनकार नहीं किया जाता है कि "स्ट्रिंग का _copy_" बनाया गया है, इस अर्थ में कि स्ट्रिंग के बाइट की प्रतिलिपि बनाई जाएगी। – Buster

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