2012-07-04 5 views
5

मैं एक स्ट्रिंग क्लास लिख रहा हूं जो होमवर्क असाइनमेंट के लिए std :: string के समान है, लेकिन मैं यह नहीं समझ सकता कि सी-स्ट्रिंग को वापस कैसे किया जाए जो स्मृति रिसाव का कारण नहीं बनता है और इसे तब तक रहने की गारंटी है अब उपयोग में नहीं है। मेरे पास वर्तमान में है:std :: string :: c_str() एक सी-स्ट्रिंग कैसे लौटाता है जो स्मृति रिसाव या अपरिभाषित सी-स्ट्रिंग सामग्री का कारण नहीं बनता है?

const char* string::c_str() 
{ 
    char c[_size+1]; 
    strncpy(c,_data,_size); 
    c[_size]='\0'; 
    return c; 
} 

लेकिन सामग्रियों को इसे जाने के कुछ ही समय बाद ओवरराइड किया गया है। यदि मैं गतिशील आवंटन करता हूं, तो मेरे पास या तो स्मृति रिसाव होगा या किसी भी समय किसी दिए गए स्ट्रिंग से केवल एक सी-स्ट्रिंग मौजूद हो सकती है। इससे कैसे बचा जा सकता है?

+1

"* या किसी भी समय किसी दिए गए स्ट्रिंग से केवल एक सी-स्ट्रिंग मौजूद हो सकती है *" यह है कि कैसे 'std :: string' काम करता है - समस्या क्या है? – ildjarn

+0

यदि 'strncpy()' उत्तर है, तो आप शायद [गलत प्रश्न पूछ रहे हैं] (http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not- सुरक्षित-strcpy.html)। –

+0

मुझे एहसास नहीं हुआ कि इसे बदलने तक ही अस्तित्व में रहना था। यह अब ओ (1) समय में काम करता है। –

उत्तर

7

लेकिन c_str द्वारा इंगित स्ट्रिंग केवल std::string को संशोधित (या नष्ट) होने तक ही अच्छी तरह से परिभाषित किया गया है।

यह प्राप्त करने का एक तरीका यह है कि आप अपने आंतरिक बफर को एक सूचक वापस कर सकते हैं (माना जाता है कि यह शून्य समाप्त हो गया है)। ध्यान रखें कि मानकों के अनुरूप c_str को ओ (1) समय में परिचालन करना है; तो प्रतिलिपि की अनुमति नहीं है।

+1

जानना अच्छा है। यह लगभग 'std :: string' वर्ग, अर्थात् वर्णों की सरणी के एक निश्चित कार्यान्वयन को मजबूर करने जैसा है। – alfC

4
http://www.cplusplus.com/reference/string/string/c_str/ से

:

प्लस पात्रों के इस क्रम के लिए आवश्यक भंडारण स्थान इसके समाप्त अशक्त-चरित्र है, लेकिन इस सरणी में मूल्यों के साथ एक आंतरिक स्थान पर वापस भेज सरणी अंक संशोधित नहीं किया जाना चाहिए प्रोग्राम में और केवल स्ट्रिंग ऑब्जेक्ट के एक गैर-निरंतर सदस्य फ़ंक्शन पर कॉल करने तक ही अपरिवर्तित रहने की गारंटी है।

0

c_str() द्वारा लौटा गया बफर उसी या यहां तक ​​कि वैध होने तक गारंटी नहीं देता है जब तक इसका उपयोग नहीं किया जाता है।

यह केवल वैध रहने की गारंटी है जब तक कि std :: स्ट्रिंग किसी भी तरह से परिवर्तित न हो जाए।

कार्यान्वयन सीधे आगे है: केवल स्ट्रिंग नल-टर्मिनेटेड का आंतरिक प्रतिनिधित्व हमेशा रखें, और c_str() से आंतरिक प्रतिनिधित्व में एक सूचक को वापस करें।

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