2012-07-04 10 views
5

Sto scrivendo una classe di stringhe che è simile a std :: string per un compito a casa, ma non riesco a capire come restituire una c-string che non causa una perdita di memoria ed è garantito che rimanga la stessa finché non è più in uso Al momento ho:In che modo std :: string :: c_str() restituisce una stringa c che non causa una perdita di memoria o un contenuto di stringa c indefinito?

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

ma i contenuti vengono sostituite poco dopo viene chiamato. Se eseguo l'allocazione dinamica, avrò una perdita di memoria o solo una stringa c può esistere da una determinata stringa in qualsiasi momento. Come posso evitare questo?

+1

"* o solo una stringa c può esistere da una determinata stringa in qualsiasi momento *" Ecco come funziona 'std :: string' - qual è il problema? – ildjarn

+0

Se 'strncpy()' è la risposta, probabilmente stai [ponendo la domanda sbagliata] (http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not- più sicuro-strcpy.html). –

+0

Non mi rendevo conto che doveva esistere solo fino a quando non è stato cambiato. Ora funziona in tempo O (1). –

risposta

7

Tuttavia, la stringa indicata da c_str è ben definita fino a quando lo std::string non viene modificato (o eliminato).

Un modo per ottenere ciò potrebbe essere semplicemente restituire un puntatore al buffer interno (presupponendo che sia terminato con null). Tenere presente che un c_str conforme agli standard deve operare in tempo O (1); quindi la copia non è permessa.

+1

Buono a sapersi. È quasi come forzare una certa implementazione della classe 'std :: string', cioè come una matrice di caratteri. – alfC

4

Da http://www.cplusplus.com/reference/string/string/c_str/:

I punti matrice restituita ad una posizione interna alla richiesta spazio per questa sequenza di caratteri più la sua terminazione nullo caratteri, ma i valori di questa matrice non devono essere modificate in il programma e sono garantiti per rimanere invariato fino alla successiva chiamata a una funzione membro non costante dell'oggetto stringa.

0

Il buffer restituito da c_str() non è garantito per rimanere uguale o addirittura valido finché non viene più utilizzato.

È garantito solo rimanere valido finché la stringa std :: non viene modificata in alcun modo.

L'implementazione è semplice: basta mantenere la rappresentazione interna della stringa terminata da null in ogni momento e restituire un puntatore alla rappresentazione interna da c_str().

Problemi correlati