वर्णों के सरणी आपके कार्यक्रम के पूरे निष्पादन के लिए चारों ओर लटकाएंगी क्योंकि उनके पास स्थिर भंडारण अवधि है। इसका मतलब यह नहीं है कि आपको उन्हें हटाने की जरूरत है - वे आपके प्रोग्राम की पूरी अवधि के लिए रहने के लिए हैं। वास्तव में, delete
पर कॉल करने से आपको अपरिभाषित व्यवहार मिलेगा। आप केवल delete
कुछ ऐसा कर सकते हैं जो new
के साथ आवंटित किया गया था।
पॉइंटर्स में स्वचालित संग्रहण अवधि होती है और जब वे दायरे से बाहर निकलते हैं तो नष्ट हो जाते हैं। यह ध्यान देने योग्य है कि सूचक को const char*
होना चाहिए क्योंकि स्ट्रिंग अक्षर आपको const char
की सरणी देता है। पर विचार करें:
void func()
{
const char* str = "Hello";
}
युक्त Hello\0
अपने कार्यक्रम की अवधि के लिए मौजूद है पात्रों की सरणी। सूचक str
केवल उस फ़ंक्शन की अवधि के लिए मौजूद है। यहां deleted
होने की आवश्यकता नहीं है।
यदि आप इसके बारे में सोचते हैं तो यह बहुत समझ में आता है। आपके स्रोत कोड में लिखने वाले इन सभी तारों को कहीं भी आपके निष्पादन योग्य में मौजूद होना चाहिए। कंपाइलर आमतौर पर पात्रों के इन तारों को आपके निष्पादन योग्य के डेटा सेगमेंट में लिखता है। जब आप अपना प्रोग्राम चलाते हैं, निष्पादन योग्य आपके स्ट्रिंग वाले डेटा सेगमेंट के साथ मेमोरी में लोड हो जाता है।
यदि आपके प्रोग्राम में दो स्ट्रिंग अक्षर हैं जिनके पास समान या ओवरलैपिंग टेक्स्ट है, तो कोई कारण नहीं है कि संकलक इसे केवल उनमें से एक को संग्रहीत करने में अनुकूलित नहीं कर सकता है। पर विचार करें:
void func()
{
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "lo";
}
संकलक केवल एक बार यहाँ निष्पादन में पात्रों Hello\0
लिखने के लिए की जरूरत है। पहले दो पॉइंटर्स केवल H
पर इंगित करेंगे और तीसरा दूसरा l
इंगित करेगा। आपका कंपाइलर इस तरह अनुकूलन कर सकता है। बेशक, इस उदाहरण के साथ, कंपाइलर स्ट्रिंग्स को एक साथ छुटकारा पाने के द्वारा और भी अनुकूलन कर सकता है - इनका उपयोग किसी भी तरह से नहीं किया जाता है जो कार्यक्रम के देखने योग्य व्यवहार में योगदान देता है।
तो हाँ, यदि आपके पास दस लाख विशिष्ट स्ट्रिंग अक्षर हैं जो किसी भी तरह से कार्यक्रम के अवलोकन करने योग्य व्यवहार में योगदान देते हैं, तो निश्चित रूप से उन्हें आपके निष्पादन योग्य के हिस्से के रूप में मौजूद होना चाहिए।
स्रोत
2013-02-13 15:49:29
सूचक ** ** ** हटाया नहीं जाता है। यह नष्ट हो जाता है, जो एक सूचक के मामले में कुछ भी नहीं करता है। –