Mantén la atención ya que en este escrito vas a hallar la solución que buscas.
Solución:
strtok() no liberará nada, ya que no tiene conocimiento de dónde está el string está almacenado. Podría estar en la pila o en el montón, ¡no lo sabe ni le importa! 🙂
¿Es más seguro hacer lo siguiente en su lugar?
Su segundo ejemplo es mucho mejor, ya que simplifica myFunc() y lo hace útil en más situaciones ya que la función no necesita saber dónde está el string está asignado. Al eliminar la llamada a free() de myFunc(), puede usar la función para analizar cadenas de la pila o el montón. ¡La persona que llama asigna la memoria, la persona que llama libera la memoria!
Lectura adicional: strtok()
En el comentario de su pregunta, dice que “Llama a strtok en ‘línea’ varias veces hasta que devuelve NULL”. Esto suena como si pudiera estar usando strtok incorrectamente. La primera vez que lo llame, debe llamarlo con ‘línea’ como argumento; en llamadas posteriores, debe pasarlo NULL. Tome el siguiente como ejemplo:
void function myFunc(char* line)
char *segment; // This will point at each delimited substring in turn.
segment = strtok(line, " ");
// Do something with segment.
segment = strtok(NULL, " ");
// Do something with the new segment.
free(line);
Sin embargo, como dijo DrTwox, su segundo ejemplo es mejor: la ‘línea’ debe ser liberada por el mismo contexto que la mallocó (o no), por lo que la llamada a free() no pertenece a esta función. Y es mejor que lo repita, algo como:
void function myFunc(char* line)
char *segment;
segment = strtok(line, " ");
while (segment != NULL)
// Do something with segment.
segment = strtok(NULL, " ");
La invocación es así:
char *line = malloc(20*sizeof(char));
// Check that malloc succeeded here.
// Put some data into 'line'.
myFunc(line);
free(line);
// No 'garbageLine' required.
La forma en que funciona strtok es un poco compleja de explicar, pero tiene las partes importantes: no asigna ni libera memoria. En su lugar, funciona modificando el string pasaste a ella.
Vale la pena explicar que strtok
hace su trabajo por:
-
devolver punteros que apuntan HACIA el original string; y
-
reemplazando cada carácter separador que encuentra con NULL.
Por lo tanto, todo está en su lugar y no necesita asignar ninguna memoria.
Sección de Reseñas y Valoraciones
Si te gustó nuestro trabajo, puedes dejar un post acerca de qué te ha impresionado de este post.