2016-03-12 20 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; 
} 

Quando eseguo questo codice, stampa "Howdy, world!" Penserei che str venga distrutto quando si esce dalle uscite changeString. Mi manca qualcosa con il modo in cui viene assegnato std::string?allocazione stringa in C++: perché funziona?

+0

I * guess * this * happened * to work. – MikeCAT

+0

A volte il comportamento non definito sembra funzionare. Non dovresti mai aspettarti che funzioni, comunque. –

+0

Sfortuna. Hai ragione che è sbagliato. –

risposta

13

Sì, str è distrutto; ma la memoria della stringa non viene cancellata; il tuo puntatore "s" punta a una memoria libera ma non cancellata. Molto pericoloso.

13

E 'comportamento non definito quando std::cout << s tenta di accedere al puntatore, perché il distruttore dei locali std::string in changeString ha liberato la memoria che il puntatore punta ancora.

Il compilatore non è necessario per diagnosticare l'errore, ma può invece generare un binario che può quindi fare tutto ciò che desidera.

Il fatto che tu abbia ottenuto l'output desiderato è stato solo sfortuna perché ti ha fatto riflettere che il tuo codice fosse corretto. Ad esempio, ho appena compilato il codice sulla mia macchina e ho invece ottenuto l'output vuoto. Potrebbe anche essersi arrestato in modo anomalo o potrebbe aver fatto altre cose non correlate.

Problemi correlati