string s = "Hello world";
char* s2 = s.c_str();
s2 ढेर में ढेर पर आवंटित किया जाएगा, या? दूसरे शब्दों में ... क्या मुझे एस 2 को हटाना होगा?
s2
ढेर पर है, हाँ। लेकिन, यह एक चरित्र के लिए एक सूचक है (जो इस मामले में s
की टेक्स्ट सामग्री के ASCIIZ प्रतिनिधित्व में पहला अक्षर होता है)। वह पाठ स्वयं ही है जहां s
ऑब्जेक्ट उस प्रतिनिधित्व को बनाने की तरह महसूस किया गया।क्रियान्वयन लेकिन वे चाहते है कि ऐसा करने के लिए अनुमति दी जाती है, लेकिन std::string
के लिए महत्वपूर्ण कार्यान्वयन विकल्प है कि क्या वे एक "छोटी स्ट्रिंग अनुकूलन" बहुत ही कम तार s
वस्तु में और भले ही प्रत्यक्ष रूप एम्बेड करने के लिए अनुमति देता है प्रदान करना है "हैलो दुनिया", इतना छोटा है कि अनुकूलन का लाभ उठाने:
- यदि हां, तो फिर
s2
s
- अन्यथा अंदर आबंटित स्मृति ढेर को इंगित होता है,
s
अंदर वहाँ मुक्त-स्टोर करने के लिए/ढेर आबंटित स्मृति एक सूचक होगा जिसमें "हैलो दुनिया \ 0 "सामग्री जिसका पता .c_str()
द्वारा वापस किया जाएगा, और एस 2 उस मान की एक प्रति होगी।
ध्यान दें कि c_str()
const
है, इसलिए के लिए अपने कोड आप const char* s2 = ...
को बदलने की जरूरत है संकलित करने के लिए।
आप s2, कोई हटाने की आवश्यकता नहीं है। आंकड़ों के जो अंक अभी भी स्वामित्व और s
वस्तु द्वारा किया जाता है एस 2, किसी भी कॉल द्वारा अवैध हो जाएगा s
की const
तरीकों गैर करने के लिए या s
से दायरे से बाहर जा रहा है।
string s = new string("Hello, mr. heap...");
char* s2 = s.c_str();
अब S2 करेंगे, ढेर पर हो के रूप में अपने मूल ढेर पर था?
इस कोड संकलन नहीं करता है, s
के रूप में एक सूचक नहीं है और एक स्ट्रिंग string(std::string*)
की तरह एक निर्माता नहीं है। आप या तो के लिए इसे बदल सकता है:
string* s = new string("Hello, mr. heap...");
... या ...
string s = *new string("Hello, mr. heap...");
बाद एक स्मृति रिसाव बनाता है और कोई उपयोगी उद्देश्य में कार्य करता है, तो के पूर्व मान लें। तब:
char* s2 = s.c_str();
... बनने के लिए की जरूरत है ...
char* s2 = s->c_str();
अब S2 करेंगे, ढेर पर हो के रूप में अपने मूल ढेर पर था?
हां। अन्यथा
वहाँ एक छोटी स्ट्रिंग अनुकूलन बफर s
अंदर करने के लिए जो c_str()
एक सूचक पैदावार, यह ढेर पर होना चाहिए है
- भले ही,: सभी स्थितियों में, विशेष रूप से अगर
s
ही ढेर पर है, तो यदि s
पाठ को संग्रहीत करने के लिए आगे की स्मृति के लिए एक सूचक का उपयोग करता है, तो उस मेमोरी को ढेर से भी आवंटित किया जाएगा।
लेकिन फिर से, यहां तक कि यकीन के लिए जानते हुए भी कि ढेर-आबंटित स्मृति को s2
अंक, अपने कोड है कि स्मृति पुनःआवंटन की जरूरत नहीं है - यह स्वचालित रूप से किया जाएगा जब s
हटा दी जाती है:
string* s = new string("Hello, mr. heap...");
const char* s2 = s->c_str();
...use s2 for something...
delete s; // "destruct" s and deallocate the heap used for it...
के बेशक, आमतौर पर string s("xyz");
का उपयोग करने के लिए बेहतर होता है जब तक कि आपको स्थानीय दायरे से अधिक जीवनकाल की आवश्यकता न हो, और std::unique_ptr<std::string>
या std::shared_ptr<std::string>
अन्यथा।
दिलचस्प, तो, आप कभी भी char * को मुक्त नहीं करेंगे क्योंकि ऐसा करने से स्ट्रिंग में आंतरिक डेटा मुक्त हो जाएगा? c_str() सचमुच वही पता रखता है जो स्ट्रिंग का उपयोग कर रहे वास्तविक डेटा के रूप में होता है? .c_str() पर एकाधिक कॉल उसी पते को उसी तरह वापस कर देंगे? (बस स्पष्टीकरण इसलिए मुझे पता है कि मैं समझता हूं) –
@Georges उन सवालों में से कुछ का जवाब इस बात पर निर्भर करता है कि आप नवीनतम मानक या पुराने मानक का उपयोग कर रहे हैं या नहीं। आप यह स्पष्ट करना चाहते हैं कि आप किसमें रुचि रखते हैं। –
@ आर। मार्टिन्होफर्नैंड्स बेहतर मानक के साथ जाएं। यह जानना दिलचस्प होगा कि यह मानक कितना हालिया है –