Dipende.
È possibile decidere e documentare che la stringa restituita è un puntatore a un buffer interno statico. Quindi la tua routine non è rientranti (né thread-safe). Ad esempio, ctime
o getpwent
.
Una cosa migliore sarebbe passare la stringa di risultati e la dimensione come argomenti, e per riempire quella stringa e possibilmente restituirla. getcwd
(o snprintf
o strftime
che restituisce una dimensione, non un puntatore) funziona in questo modo.
Ma in genere, si decide e si documenta che la stringa restituita è allocata su heap, ed è la responsabilità del chiamante su free
. In questo caso potresti voler utilizzare strdup
o asprintf
.
E si potrebbe utilizzare nel vostro intero programma Boehm's conservative garbage collector (ad esempio, utilizzare il suo GC_STRDUP
o GC_MALLOC_ATOMIC
per le stringhe, e GC_MALLOC
per i valori di heap che contiene alcune indicazioni.)
Se ritieni che di serie malloc
o strdup
è troppo lento (ma si prega di misurare prima), si potrebbe avere il proprio pool di allocatori, ecc.
Si potrebbe anche avere schemi alternativi (ma è importante documentarli). Ad esempio, è possibile restituire alcuni interned string o anche una stringa interna canonica (a volte denominata "quark" o "simbolo"), quindi essere in grado di utilizzare l'uguaglianza del puntatore anziché l'uguaglianza delle stringhe. Potresti anche avere uno schema reference counter. Guardate per esempio a quello che Glib (da GTK, ma al di fuori utilizzabile di programmi con interfaccia grafica!) Dispone: GString-s, GQuark-s, string utilities
E 'comunque importante per decidere se il risultato è heap allocata o meno, e di definire chiaramente chi ha la responsabilità di liberare (e come dovrebbe essere liberato) quel risultato assegnato all'heap.
È possibile utilizzare valgrind per individuare perdite di memoria. Non dimenticare di passare -Wall -g
al tuo compilatore gcc
!
PS. Vorrei prendere in considerazione l'utilizzo del GC di Boehm. E non penso che malloc
(o strdup
, asprintf
....) debba essere rifiutato per motivi di prestazioni (è possibile scegliere altre & più veloci malloc
implementazione o utilizzare i propri pool di memoria). Tuttavia, le perdite di memoria potrebbero essere un problema.
La chiamata 'malloc' è meglio scritta come' char * str = malloc (20); '' sizeof (char) 'è 1 per definizione e il risultato di' malloc' non è necessario e [non raccomandato] (http://c-faq.com/malloc/mallocnocast.html). –
@KeithThompson Non ho mai saputo che il risultato del malloc può portare a comportamenti indesiderati. Grazie per le informazioni! :) – blenzcoffee
@KeithThompson Non raccomanderei di omettere la sizeof (char); è buona pratica tenerlo lì e sarebbe un compilatore terribile che non lo ottimizzasse. Anche gli argomenti contro il casting malloc mi sono sempre sembrati sciocchi; è richiesto in C++ e, a mio parere, potresti anche scrivere codice in linguaggio portatile quando puoi. – Dave