Saltar al contenido

¿Cómo usar strtok en C correctamente para que no haya pérdida de memoria?

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:

  1. devolver punteros que apuntan HACIA el original string; y

  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *