"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > std::string फ़ंक्शन से C स्ट्रिंग लिटरल लौटाना कभी-कभी काम क्यों करता है, लेकिन फिर भी अपरिभाषित व्यवहार है?

std::string फ़ंक्शन से C स्ट्रिंग लिटरल लौटाना कभी-कभी काम क्यों करता है, लेकिन फिर भी अपरिभाषित व्यवहार है?

2024-11-18 को प्रकाशित
ब्राउज़ करें:135

Why Does Returning a C String Literal from a std::string Function Seem to Work Sometimes, But is Still Undefined Behavior?

std::string फ़ंक्शन से C स्ट्रिंग अक्षरशः लौटाना और c_str()

C में कॉल करना, std::string फ़ंक्शन से C स्ट्रिंग अक्षरशः लौटाना एक है गलत सलाह वाला अभ्यास जो अपरिभाषित व्यवहार को जन्म दे सकता है। हालाँकि, एक आम ग़लतफ़हमी यह है कि इस कोड को विफल हो जाना चाहिए, जबकि यह कुछ मामलों में काम करता प्रतीत होता है।

जब "यह मैं हूँ!!" myFunction() को पास कर दिया जाता है, C स्ट्रिंग शाब्दिक रूप से std::string ऑब्जेक्ट में परिवर्तित हो जाता है। लौटाया गया std::string ऑब्जेक्ट अपने आंतरिक वर्ण बफ़र को इंगित करता है, जिसमें स्ट्रिंग अक्षरशः की एक प्रति होती है। std::string पर c_str() को कॉल करने से इस बफ़र पर एक पॉइंटर लौट आता है।

संभावित समस्या उत्पन्न होती है क्योंकि std::string ऑब्जेक्ट का आंतरिक कैरेक्टर बफ़र स्थिर मेमोरी में संग्रहीत नहीं होता है। एक बार जब myFunction() फ़ंक्शन वापस आ जाता है, तो std::string ऑब्जेक्ट और उसका आंतरिक बफर नष्ट हो जाता है। इसका मतलब यह है कि c_str() से प्राप्त पॉइंटर एक लटकता हुआ पॉइंटर बन जाता है जो डीललोकेटेड मेमोरी की ओर इशारा करता है। . इसे स्मृति दृढ़ता के रूप में जाना जाता है। परिणामस्वरूप, ऑपरेटिंग सिस्टम गलती से कोड को हटाए गए मेमोरी तक पहुंच जारी रखने की अनुमति देता है, जिससे यह भ्रम होता है कि कोड सही ढंग से काम करता है।

इस बात पर जोर देना महत्वपूर्ण है कि यह व्यवहार C में अपरिभाषित है। भाषा मानक यह परिभाषित नहीं करता है कि इस स्थिति में क्या होता है, और विभिन्न कार्यान्वयन अलग-अलग व्यवहार कर सकते हैं। स्मृति दृढ़ता पर भरोसा करना खतरनाक है और विभिन्न संदर्भों में या विभिन्न ऑपरेटिंग सिस्टम पर अप्रत्याशित त्रुटियों को जन्म दे सकता है।

इसलिए, जबकि उदाहरण कोड कुछ मामलों में काम करता हुआ प्रतीत हो सकता है, फिर भी इसे अपरिभाषित व्यवहार माना जाता है और होना चाहिए टाला. ऐसे मुद्दों को रोकने के लिए, इसके आंतरिक बफर पर सीधे सूचक के बजाय std::string फ़ंक्शन से स्ट्रिंग शाब्दिक की एक प्रति वापस करने की अनुशंसा की जाती है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3