2010-03-03 11 views
14

Ho bisogno di una funzione per restituire una stringa a cui si accede solo in sola lettura. Il contenuto della stringa è noto al momento della compilazione, quindi userò comunque una stringa letterale.Restituisce un indirizzo letterale stringa da una funzione sicura e portatile?

posso tornare qualcosa come std::string:

std::string myFunction() 
{ 
    return "string"; 
} 

o tornare const char*:

const char* myFunction() 
{ 
    return "string"; 
} 

è la seconda alternativa sicura e portatile in questo scenario?

risposta

12

La seconda alternativa è sicura e portatile in questo scenario?

Sì! L'allocazione di memoria di stringhe letterali è statica e persistono per tutta la durata dell'applicazione.

+0

Potresti fornire un riferimento per la prova? –

3

Sì. (Non è diverso da memorizzare tale puntatore in una struttura di dati globale).

10

Sì! Ma attenzione di questo potenziale Gotcha:

char * myFunc() { 
    return "Constant string?"; 
} 

Sì, è possibile convertire una stringa letterale ad un non-constchar *! Ciò ti consentirà di rompere il mondo in seguito tentando di modificare il contenuto di tale char *. Questa "caratteristica" esiste per motivi legacy - i valori letterali delle stringhe sono più vecchi di const e originariamente definiti come char * in C.

g ++ lancia un avviso sgradevole per questo, anche in modalità predefinita, per fortuna. Non so se VC++ lancia un avvertimento altrettanto ardentemente.

+0

@Philip: l'ho provato in VS2008 e non ho ricevuto alcun avviso. Non so se c'è un avvertimento per questo. Forse c'è ed è disattivato di default perché così tante delle intestazioni fornite attiveranno l'avvertimento ;-) – quamrana

Problemi correlati