Solucionar el error de puntero inválido libre en C

Jinku Hu 12 octubre 2023
  1. No libere punteros que apunten a posiciones de memoria no dinámicas
  2. No libere punteros que ya han sido liberados
Solucionar el error de puntero inválido libre en C

Este artículo introducirá múltiples métodos sobre cómo arreglar el error de puntero inválido free en C.

No libere punteros que apunten a posiciones de memoria no dinámicas

La llamada a la función free sólo debe usarse para desocupar la memoria de los punteros que han sido devueltos por las funciones malloc, calloc o realloc. El siguiente código muestra el escenario en el que al puntero char* se le asigna un valor devuelto por la llamada malloc, pero más tarde, en el bloque else, el mismo puntero se reasigna con un literal de cadena. Esto significa que la variable c_str apunta a una ubicación que no es una región de memoria dinámica, por lo que no se puede pasar a la función free. Como resultado, cuando se ejecuta el siguiente ejemplo, y el programa llega a la llamada a la función free, se aborta, y se muestra el error free(): invalid pointer.

Tenga en cuenta que no se deben reasignar los punteros a ubicaciones de memoria dinámica con direcciones diferentes, a menos que haya otras variables puntero que sigan apuntando a la ubicación original. Por último, sólo debe llamar a la función free en punteros que apunten a memoria del montón.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[]) {
  char *c_str = NULL;
  size_t len;

  if (argc != 2) {
    printf("Usage: ./program string\n");
    exit(EXIT_FAILURE);
  }

  if ((len = strlen(argv[1])) >= 4) {
    c_str = (char *)malloc(len);

    if (!c_str) {
      perror("malloc");
    }

    strcpy(c_str, argv[1]);
    printf("%s\n", c_str);
  } else {
    c_str = "Some Literal String";
    printf("%s\n", c_str);
  }
  free(c_str);

  exit(EXIT_SUCCESS);
}

No libere punteros que ya han sido liberados

Otro error común cuando se utiliza la memoria dinámica es llamar a la función free sobre los punteros que ya han sido liberados. Este escenario es más probable cuando hay múltiples variables puntero que apuntan a la misma región de memoria dinámica. El siguiente código de ejemplo demuestra uno de estos posibles casos, donde la misma ubicación es liberada en diferentes ámbitos.

Tenga en cuenta que este ejemplo es un programa corto de un solo archivo, y será fácil diagnosticar un problema como este, pero en las bases de código más grandes, uno podría encontrar difícil rastrear la fuente sin programas inspectores externos que hagan análisis estático.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[]) {
  char *c_str = NULL;
  size_t len;

  if (argc != 2) {
    printf("Usage: ./program string\n");
    exit(EXIT_FAILURE);
  }
  char *s = NULL;

  if ((len = strlen(argv[1])) >= 4) {
    c_str = (char *)malloc(len);
    s = c_str;

    if (!c_str) {
      perror("malloc");
    }

    strcpy(c_str, argv[1]);
    printf("%s\n", c_str);
    free(c_str);
  } else {
    c_str = "Some Literal String";
    printf("%s\n", c_str);
  }
  free(s);

  exit(EXIT_SUCCESS);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C Pointer