दिलचस्प पोस्ट
इरादा-फ़िल्टर का उपयोग करके यूआरएल से एंड्रॉइड ऐप खोलें एंड्रॉइड में एक अमीर पाठ संपादक को लागू करना? स्क्रिप्ट टैग का संदर्भ किस प्रकार किया जा सकता है जो वर्तमान में क्रियान्वित स्क्रिप्ट को लोड करता है? लोड () विधि नापसंद? उदाहरण के स्तर पर एक विधि को ओवरराइड करें एसईसीएल क्वेरी से वेतन तालिका से नौवीं सबसे ज्यादा वेतन मिलता है JSON विशेषता को निकालें क्यों नहीं मैं res.json को कॉल इनलाइन कर सकते हैं? नि: शुल्क एफ़टीपी पुस्तकालय पॉवरहेल बहुआयामी arrays जावा में किसी भी वेब पेज से छवि को कैसे डाउनलोड करें जावास्क्रिप्ट से PHP और इसके विपरीत डेटा कैसे पास करें? PHP में preg_match और UTF-8 जांचें कि तालिका मौजूद है या नहीं JQuery के `टॉगल (…)` के बजाय 1.8 का उपयोग करने के लिए क्या करें?

क्या फ़ंक्शन से "const char *" लौटने का एक अच्छा विचार है?

अब मेरे पास एक फ़ंक्शन है जिसमें स्ट्रिंग वापस करना है। मैंने एक विशेष कार्यान्वयन देखा था जहां वह फ़ंक्शन से कॉन्स्ट चार * देता है।

कुछ इस तरह:

const char * GetSomeString() { ........ return somestlstring.c_str(); } SomeOtherFoo () { const char * tmp = GetSomeString(); string s = tmp; } 

अब मुझे लगा कि इस के साथ संभावित रूप से कुछ गलत है क्या मेरा पेट ठीक है? या यह एक बिल्कुल सुरक्षित कोड है?

कृपया मुझे उर सुझाव दें मुझे एक रिश्तेदार रिटर्न कॉन्स्ट चार * इस तरह का विनाश हो सकता है ..

धन्यवाद, अर्जुन

वेब के समाधान से एकत्रित समाधान "क्या फ़ंक्शन से "const char *" लौटने का एक अच्छा विचार है?"

क्या somestlstring है और वहां क्या किया जा रहा है इसके आधार पर।

यदि यह एक स्थानीय चर है, तो आप पॉइन्टर को मेमोरी में लौट रहे हैं जो कि GetSomeString पूर्ण होने पर जारी किया जा रहा है, इसलिए यह एक लटकती सूचक और एक त्रुटि है।

यह सब somestlstring के जीवनकाल में somestlstring और आपके द्वारा किए जाने वाले कार्यों में पॉइंटर .c_str() द्वारा दिया जाता है, वह स्ट्रिंग में अगले म्यूटेटिंग ऑपरेशन तक केवल मान्य है। इसलिए यदि कुछ कॉल को .c_str() से कॉल करने के लिए कुछ समय पहले बदलता है और s के निर्माण से पहले आप अपरिभाषित व्यवहार भूमि में होंगे।

अगर आप c_str() std::string c_str() फ़ंक्शन द्वारा लौटा दिए गए const char * के जीवनकाल के बारे में पूछ रहे हैं, तब तक यह मान्य है जब तक कि आप इसे प्राप्त स्ट्रिंग को संशोधित नहीं करते, या जब तक स्ट्रिंग नष्ट नहीं हो जाती। इसे एक समारोह से लौटना ठीक है (हालांकि मैं नहीं कहूँगा महान अभ्यास), बशर्ते आप उन दो तथ्यों को ध्यान में रखते हैं।

नील की परिस्थितियों में यह ठीक है। हालांकि स्ट्रिंग के संदर्भ वापस करने के लिए एक बेहतर तरीका होगा

 string const& GetSomeString() { ........ return somestlstring; } string s = GetSomeString(); 

फिर भी ध्यान में रखते हुए कि isomestlstring 'एक स्थानीय स्वचालित चर नहीं होना चाहिए, लेकिन किसी नाम स्थान या कक्षा में कहीं और संग्रहीत नहीं होना चाहिए। अन्यथा आप मूल्य से स्ट्रिंग वापस कर सकते हैं

 string GetSomeString() { ........ return somestlstring; // can be a local automatic variable } string s = GetSomeString(); 

यह अच्छा नहीं है – आपके स्ट्रिंग के लिए स्मृति कितनी देर तक रहती है? इसे हटाने के लिए कौन जिम्मेदार है? क्या इसे हटाया जाना चाहिए?

आप स्ट्रिंग मेमोरी आवंटन और मुक्त करने के लिए जिम्मेदार एक स्ट्रिंग ऑब्जेक्ट लौटने से बेहतर हैं – यह एक std :: स्ट्रिंग, या एक कस्टस्ट्रिंग (यदि आप क्यूटी प्रयोग कर रहे हैं), या सीएसटीआईडी ​​(यदि आप एमएफसी का उपयोग कर रहे हैं / एटीएल)

थोड़ा अलग नोट पर, क्या आपकी स्ट्रिंग कभी यूनिकोड होगी? अधिकांश स्ट्रिंग वर्ग यूनिकोड डेटा के साथ पारदर्शी तरीके से सौदा कर सकते हैं, लेकिन const char नहीं करेंगे …

यह उस स्थान पर निर्भर करता है जहां somestlstring चर स्थित है।

यदि यह GetSomeString() फ़ंक्शन के लिए एक चर लोकेल है, तो यह स्पष्ट रूप से गलत है दरअसल, somestlstring चर फ़ंक्शन के अंत में नष्ट हो जाता है, और इस तरह const char * कुछ को इंगित करता है जो अब मौजूद नहीं है।

यदि यह एक वैश्विक चर है, तो यह कोड सही है।

कुछ परिस्थितियों को जोड़ने के लिए जिसमें यह ठीक होगा:

  • somestlstring एक वैश्विक चर है जो उसी अनुवाद इकाई (। सीपीपी) में GetSomeString () के रूप में आरंभ किया गया है
  • somestlstring एक गैर-स्थिर वर्ग सदस्य है, और GetSomeString उस वर्ग के सदस्य है। उस स्थिति में, लौटाई गई सूचक का जीवनकाल दस्तावेज होना चाहिए (मूल रूप से – जैसा कि अन्य ने कहा – जब तक कि स्लग परिवर्तन या ऑब्जेक्ट नष्ट नहीं हो जाता)
  • आप एक अक्षर const * को एक शाब्दिक या संकलन समय प्रारंभिक स्ट्रिंग में लौट रहे हैं