¿Cómo puedo saber cuándo debo liberar cadenas en C devueltas por las funciones de la biblioteca?

¿Qué cadenas debo liberar en C por mi cuenta, usando free() ¹?

Mi estado de conocimiento:

  • char a[256]; : no
  • char *a = "abcdefg"; : no
  • char *a = malloc(15L); : si
  • una cadena devuelta por getenv() : no
  • cadenas devueltas por las funciones de Windows²: ???

¹ o LocalFree() / GlobalFree() / VirtualFree()
² en particular por GetCommandLineW()

Esto siempre se mencionará en la documentación de cualquier API que utilice que devuelva cadenas (u otros datos más grandes que un solo valor simple, como un entero).

Sí, esto significa que debe leer detenidamente la documentación de todas las funciones de la API, para poder realizar un seguimiento y no perder memoria.

Los únicos trozos de memoria que deben estar free d son aquellos que antes eran de malloc ed.

Ahora las preguntas son “¿este puntero es un puntero a la memoria que fue creado por malloc ?” y, si es así, “¿se supone que debo liberarlo yo mismo o me ocuparé de alguna otra función?”

No hay respuestas fáciles a estas preguntas, generalmente la documentación lo dirá así, pero la regla general es que el módulo que se ocupa de la creación de memoria también se ocupa de la desasignación. Por lo tanto, si la biblioteca que utiliza espera que usted proporcione memoria ya asignada, también debe liberarla cuando sea necesario.

En caso de una asignación dinámica explícita, es decir, malloc/alloc/realloc , debe free explícitamente. Pero ahora que ha mencionado sobre las cadenas, hay una función especial strdup() que le strdup() cuando lo llama.

En el caso de strdup() , debe asegurarse de que, sin su asignación, DEBE free .