सी फ़ंक्शन में निहित रिटर्न को समझना
सी में, जब किसी फ़ंक्शन में एक स्ट्रिंग अक्षरशः पास किया जाता है, तो कंपाइलर इसे अंतर्निहित रूप से परिवर्तित करता है std::स्ट्रिंग ऑब्जेक्ट। हालाँकि, निम्नलिखित उदाहरण में, हम एक std::string फ़ंक्शन से एक C-स्टाइल स्ट्रिंग शाब्दिक लौटाते हैं:
std::string myFunction() {
return "it's me!!";
}
यह एक चिंता पैदा करता है क्योंकि यहां पर अंतर्निहित रूप से बुलाया गया std::string कंस्ट्रक्टर स्ट्रिंग शाब्दिक की एक प्रति बनाता है। जब फ़ंक्शन वापस आता है, तो एक लटकते हुए पॉइंटर को छोड़कर, इस प्रतिलिपि को हटा दिया जाना चाहिए। c_str() std::string ऑब्जेक्ट में संग्रहीत डेटा पर एक पॉइंटर लौटाता है। यह पॉइंटर उसी मेमोरी की ओर इशारा करता है जो std::string ऑब्जेक्ट के हटा दिए जाने के बाद भी स्ट्रिंग को अक्षरशः रखती है।
यह क्यों काम करता है (क्रमबद्ध करें)
इस कोड के काम करने का कारण ऑपरेटिंग सिस्टम के मेमोरी प्रबंधन की विचित्रता है। जब एक मेमोरी ब्लॉक को हटा दिया जाता है, तो ओएस हमेशा इसकी सामग्री को साफ़ नहीं करता है। इसका मतलब यह है कि स्ट्रिंग शाब्दिक का डेटा अभी भी मेमोरी में मौजूद है, भले ही यह तकनीकी रूप से पहुंच योग्य नहीं है।
अपरिभाषित व्यवहार और भाग्य
यह ध्यान रखना महत्वपूर्ण है कि यह व्यवहार अपरिभाषित है सी मानक के अनुसार. इसका मतलब यह है कि क्रैश या गलत परिणाम सहित कुछ भी हो सकता है। यह कुछ मामलों में उचित सी प्रथाओं के कारण नहीं, बल्कि ओएस के कार्यान्वयन विवरण के कारण काम करता है।
इसलिए, इस व्यवहार पर भरोसा करने से बचना महत्वपूर्ण है और हमेशा सुनिश्चित करें कि डेटा आपके सी कोड में सही ढंग से आवंटित और हटाया गया है .
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3