2016-03-12 12 views
9
void changeString(const char* &s){ 
    std::string str(s); 
    str.replace(0, 5, "Howdy"); 
    s = str.c_str(); 
} 

int main() { 
    const char *s = "Hello, world!"; 
    changeString(s); 
    std::cout << s << "\n"; 
    return 0; 
} 

जब मैं यह कोड चलाता हूं, तो यह प्रिंट करता है "हाउडी, दुनिया!" मुझे लगता है कि strchangeString बाहर निकलने पर नष्ट हो जाता है। क्या मुझे std::string आवंटित करने के तरीके से कुछ याद आ रहा है?सी ++ में स्ट्रिंग आवंटन: यह क्यों काम करता है?

+0

मैं * अनुमान * यह * हुआ * काम करने के लिए। – MikeCAT

+0

कभी-कभी अपरिभाषित व्यवहार काम पर प्रतीत होता है। हालांकि, आपको कभी काम करने की उम्मीद नहीं करनी चाहिए। –

+0

खराब भाग्य। आप सही हैं कि यह गलत है। –

उत्तर

13

हां, str नष्ट हो गया है; लेकिन स्ट्रिंग की स्मृति साफ़ नहीं है; आपका "पॉइंटर पॉइंट एक मुफ़्त लेकिन गैर मंजूरी मेमोरी पर इंगित करता है। बहूत खतरनाक।

13

यह है, जब std::cout << s सूचक का उपयोग करने की कोशिश करता है अपरिभाषित व्यवहार है क्योंकि changeString में स्थानीय std::string का नाशक स्मृति जो सूचक अभी भी के लिए अंक मुक्त कर दिया गया है।

आपके कंपाइलर को त्रुटि का निदान करने की आवश्यकता नहीं है, बल्कि इसके बजाय एक बाइनरी उत्पन्न कर सकती है जो तब भी कर सकती है जो वह चाहती है।

तथ्य यह है कि आपको वांछित आउटपुट मिला है, यह केवल दुर्भाग्यपूर्ण था क्योंकि यह आपको लगता है कि आपका कोड सही था। उदाहरण के लिए, मैंने बस अपनी मशीन पर अपना कोड संकलित कर लिया है और इसके बजाय खाली आउटपुट प्राप्त किया है। यह भी दुर्घटनाग्रस्त हो सकता है, या यह अन्य, असंबंधित चीजें हो सकती है।

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