In C++ 11 norma è esplicitamente stabilito che .c_str()
(così come nuova .data()
) tornerà puntatore al buffer interno che viene utilizzato da std::string
.
Qualsiasi modifica del std :: string dopo aver ottenuto il puntatore tramite .c_str()
può risultato in detto char *
restituito per diventare valido (ovvero - se std::string
avuto internamente per riallocare lo spazio).
Nei precedenti standard C++, l'implementazione può restituire qualsiasi cosa. Ma come standard non richiedono all'utente di deallocare il risultato, non ho mai visto alcuna implementazione che restituisca qualcosa di nuovo allocato. Almeno la stringa STL di GNU gcc e MSVC++ sono array di caratura con terminazione a zero interna, che vengono restituiti da c_str()
.
Quindi è sicuro assumere (con normale attenzione per C++) che in qualsiasi versione di C++ in qualsiasi sua implementazione .c_str()
restituirà il buffer interno.
In altre parole - si dovrebbe mai e poi mai mantenere il valore della .c_str()
se non si è sicuri al 100% che è non cambierà la sua dimensione in qualsiasi momento in futuro (a meno che non si tratta di un const
, che è).
P.S. A proposito, non dovresti mai fare mai char* pointer=(char*)str.c_str();
. È const char *
e non devi modificare il contenuto, in parte perché sopra - potresti finire per sovrascrivere la memoria di qualche altro oggetto o corrompendo lo stato interno di std::string
, nel caso in cui l'implementazione faccia qualcosa di strano, come l'indicizzazione dei caratteri più veloce .find()
(più recente visto questo, ma hey - questo è un incapsulamento!)
fonte
2013-07-01 11:18:16
* Perché * vuoi questo indirizzo? Cosa stai cercando di fare per la stringa? – trojanfoe
Stai cercando una risposta C++ 11 o una C++ 03? La risposta corretta dipende da questo. Senza ulteriori specifiche, assumerei ulteriormente C++ 11. –
Forse potresti rispondere alle domande in modo che possiamo rispondere meglio alla tua domanda? Sei stato qui pochi minuti fa. –