यह आम तौर पर सुरक्षित है, भले ही आंतरिक स्ट्रिंग अनुक्रम लगातार स्मृति में संग्रहीत किया गया हो या नहीं। निरंतरता के अलावा std::string
ऑब्जेक्ट द्वारा नियंत्रित अनुक्रम को संग्रहीत करने के तरीके से संबंधित कई अन्य कार्यान्वयन विवरण हो सकते हैं।
इसके साथ वास्तविक व्यावहारिक समस्या निम्न हो सकती है। std::string
के नियंत्रित अनुक्रम को शून्य-समाप्त स्ट्रिंग के रूप में संग्रहीत करने की आवश्यकता नहीं है। हालांकि, व्यावहारिक रूप से, कई (अधिकांश?) कार्यान्वयन आंतरिक बफर को 1 से अधिक करने का चयन करते हैं और अनुक्रम को शून्य-समाप्त स्ट्रिंग के रूप में संग्रहीत करते हैं क्योंकि यह c_str()
विधि के कार्यान्वयन को सरल बनाता है: केवल आंतरिक बफर पर एक पॉइंटर लौटाएं और आप किया हुआ।
आपके प्रश्न में उद्धृत कोड आंतरिक बफर में कॉपी किए गए डेटा को शून्य-समाप्त करने का कोई प्रयास नहीं करता है। काफी संभवतः यह नहीं जानता कि std::string
के कार्यान्वयन में शून्य-समाप्ति आवश्यक है या नहीं। काफी संभवतः यह resize
पर कॉल के बाद ज़ीरो से भरे आंतरिक बफर पर निर्भर करता है, इसलिए कार्यान्वयन द्वारा शून्य टर्मिनेटर के लिए आवंटित अतिरिक्त वर्ण आसानी से शून्य पर पूर्व-निर्धारित होता है। यह सब कार्यान्वयन विस्तार है, जिसका अर्थ यह है कि यह तकनीक कुछ नाजुक धारणाओं पर निर्भर करती है।
दूसरे शब्दों में, आपको कुछ कार्यान्वयन में शायद strcpy
का उपयोग करना होगा, memcpy
डेटा को नियंत्रित अनुक्रम में डेटा को मजबूर करने के लिए। जबकि कुछ अन्य कार्यान्वयन में आपको memcpy
और strcpy
का उपयोग करना होगा।
एस [0] का उपयोग ठीक है, memcpy() तर्कसंगत रूप से कम है। क्यों न केवल असाइनमेंट करें, या स्ट्रिंग के असाइन() सदस्य फ़ंक्शन का उपयोग करें? –
@ नील बटरवर्थ, यही वह है जो मैं इस कोड को देखते हुए खुद से पूछ रहा हूं ...;) – paxos1977
जब आप सी ++ में अनुभव प्रोग्रामिंग प्राप्त करते हैं, तो आप 'memset' और' memcpy' का उपयोग करने से अधिक से अधिक बचना होगा, और सीखेंगे तर्क यह आपके अनुभव में जोड़ने वाला है। –