इस तरह एक कोड को ध्यान में रखते:क्या यह std :: स्ट्रिंग को स्वयं में जोड़ना सुरक्षित है?
std::string str = "abcdef";
const size_t num = 50;
const size_t baselen = str.length();
while (str.length() < num)
str.append(str, 0, baselen);
इसे इस तरह खुद पर std::basic_string<T>::append()
कॉल करने के लिए सुरक्षित है? कॉपी ऑपरेशन से पहले बढ़कर स्रोत मेमोरी को अमान्य कर दिया जा सकता है?
मुझे उस विधि के विशिष्ट मानक में कुछ भी नहीं मिला। यह कहता है कि उपर्युक्त str.append(str.data(), baselen)
के बराबर है, जो मुझे लगता है कि append(const char*, size_t)
के अंदर ऐसे मामलों का एक और पता लगाने तक मुझे पूरी तरह से सुरक्षित नहीं किया जा सकता है।
मैंने कुछ कार्यान्वयन की जांच की और वे सुरक्षित तरीके से एक या दूसरे लग रहे थे, लेकिन मेरा सवाल यह है कि यदि इस व्यवहार की गारंटी है। जैसे "Appending std::vector to itself, undefined behavior?" कहता है कि यह std::vector
के लिए नहीं है।
यह होना चाहिए लेकिन खुद की तरह मुझे कुछ भी रास्ता नहीं मिल सकता है। 'str + = str; 'कानूनी है और यह एक ही चीज़ पर उबालता है इसलिए मुझे लगता है कि यह ठीक है। – NathanOliver
@NathanOliver: वास्तव में, इसे अवैध बनाने के लिए एक अच्छा कारण नहीं है। तारों के साथ, एक ही स्ट्रिंग को स्वयं को जोड़ना, या स्ट्रिंग का सबसेट, उचित है। 'वेक्टर' के साथ, यह बहुत कम संभावना है। –
@ निकोलबोलस मुझे वह मिलता है। मैं बस अपने तर्क का समर्थन करने के लिए मानक नहीं ढूंढ रहा था। ऐसा लगता है जैसे Rakete1111 किया था। – NathanOliver