2010-04-05 18 views
20

इस कोड पर विचार करें:लाइफटाइम शाब्दिक एक समारोह से वापस लौटे

const char* someFun() { 
    // ... some stuff 
    return "Some text!!" 
} 

int main() 
{ 
    { // Block: A 
     const char* retStr = someFun(); 
     // use retStr 
    } 
} 

समारोह someFun(), जहां "Some text!!" संग्रहीत (मुझे लगता है कि रोम के कुछ स्थिर क्षेत्र में हो सकता है) है और क्या इसके है जीवनकाल का दायरा?

क्या retStr द्वारा दी गई मेमोरी को पूरे कार्यक्रम में कब्जा कर लिया जाएगा या ब्लॉक ए बाहर निकलने के बाद रिलीज़ किया जाएगा?

+0

आप भी इस प्रश्न पर एक नज़र हो सकता है: http://stackoverflow.com/questions/267114/scope-of-string-literals – quinmars

उत्तर

38

सी ++ मानक यह नहीं कहता कि स्ट्रिंग अक्षर कहाँ संग्रहित किया जाना चाहिए। हालांकि यह गारंटी देता है कि उनका जीवनकाल कार्यक्रम का जीवनकाल है। आपका कोड इसलिए मान्य है।

5

स्ट्रिंग को विशेष रूप से प्रोग्राम बाइनरी के विशेष (आमतौर पर केवल पढ़ने के लिए आधुनिक ओएस) अनुभाग में संग्रहीत किया जाएगा। इसकी मेमोरी आवंटित नहीं की जाती है (व्यक्तिगत रूप से स्ट्रिंग के लिए, केवल कुल अनुभाग के लिए इसे स्मृति में लोड करते समय) और इसे हटाया नहीं जाएगा।

+3

कि कोई जरूरी सच है। क्या होगा यदि आप जिस बाइनरी प्रारूप से लिंक कर रहे हैं, वह "केवल-पढ़ने वाले अनुभाग" की धारणा का समर्थन नहीं करता है? (उदाहरण के लिए सबसे बुनियादी COM फ़ाइलें) – conio

+1

मैमोंट ने केवल खंडों को भी नहीं पढ़ा है। उनके पास केवल ऐतिहासिक रुचि है। – osgx

+0

कॉम फ़ाइल में भी स्थिरांक संग्रहित करने के लिए कुछ भाग (फ़ाइल का अनुभाग), या कई होंगे। उन्हें केवल सेगमेंट में या पेज डिस्क्रिप्टर में पढ़ने के रूप में चिह्नित नहीं किया जाएगा, लेकिन विचार वही होगा। – osgx

23

"Some text!!" में स्कोप नहीं है। स्कोपकी संपत्ति इकाई नाम की एक संपत्ति है। अधिक सटीक, यह नाम की एक संपत्ति है। "Some text!!" एक नामहीन ऑब्जेक्ट - एक स्ट्रिंग शाब्दिक है। इसका कोई नाम नहीं है, और इसलिए इसके "दायरे" के बारे में कोई भी चर्चा कोई समझ नहीं लेती है। इसमें कोई गुंजाइश नहीं है।

आप जो पूछ रहे हैं वह स्कोप नहीं है। यह जीवनकाल या भंडारण अवधि"Some text!!" है। सी/सी ++ में स्ट्रिंग अक्षर स्थिर भंडारण अवधि है, जिसका अर्थ है कि वे "हमेशा के लिए" रहते हैं, यानी जब तक कार्यक्रम चलता है। इसलिए, "Some text!!" पर कब्जा कर लिया गया स्मृति कभी जारी नहीं किया गया है।

बस ध्यान रखें (एक साइड नोट के रूप में) कि स्ट्रिंग अक्षर गैर-संशोधित वस्तुएं हैं। उस स्मृति में लिखना अवैध है।

+2

सही यह जीवनकाल है, गुंजाइश नहीं है, मेरा बुरा :( – sud03r

-1

क्या रीट एसआरटी द्वारा इंगित स्मृति को पूरे कार्यक्रम पर कब्जा कर लिया जाएगा या ब्लॉक ए बाहर निकलने के बाद जारी किया जाएगा?

संपादित करें:

यह जारी नहीं होगा, लेकिन retStr उपलब्ध नहीं होगा। (ब्लॉक गुंजाइश)

const char *ptr; 
{ 
    const char* retStr = "Scope"; 
    ptr = retStr; 
} 

printf("%s\n", ptr); //prints "Scope" 

//printf("%s\n", retStr); //will throw error "retStr undeclared" 
+0

यह केवल रिलीज़ नहीं होगा, केवल एसटीएसआरआर उपलब्ध नहीं होगा – sud03r

+0

गलत। निष्पादन के बाद अंक को रेट करने के लिए स्मृति स्थिर स्मृति है। आवेदन आवंटित होने पर आवंटित किया जाता है शुरू होता है और एप्लिकेशन को समाप्त होने पर ही (प्रभावी रूप से) जारी किया जाता है। – Alan

+0

@all: मेरी गलती, मैं 'retStr' के बारे में सोच रहा था। जवाब बदल जाएगा। –

संबंधित मुद्दे