Creo que tengo una buena comprensión de cómo manejar la memoria en C++, pero hacerlo en C es diferente, estoy un poco apagado.¿La mejor manera de manejar la asignación de memoria en C?
En C++ tengo constructores y destructores, tengo la novedad bastante simple y elimino y sé cómo encapsularlo usando RAII, usando punteros inteligentes y dentro de las clases.
Sin embargo, en C No puedo manejar malloc y liberarme de la misma manera. No sé cómo ocultarlos y cómo automatizar las cosas. Todo lo que puedo entender es usar funciones para iniciar y destruir mis punteros. ¿Pero cómo debería estructurar mi manejo de la memoria?
Al escribir esto me he dado cuenta de que esto es más una cuestión acerca de que yo entienda el flujo de C que cualquier otra cosa, sino una pregunta a la vez.
Editar: Gracias por las respuestas, pero tengo que reformularme.
Cuando digo que uso RAII y punteros inteligentes para C++, no quiero lo mismo para C, sé que no es lo mismo. Pero cómo manejo la asignación de memoria en C++ está conectado a estas técnicas.
Por ejemplo, en mis clases, agrego y destruyo dinámicamente la memoria que usa mi clase. De esta forma puedo lograr una especie de encapsulado, no necesito saber cuándo/cómo/por qué la clase maneja su memoria, simplemente lo hace. Esto significa que puedo "esconder" el menor manejo de memoria y solo enfocarme en algunas clases "más grandes".
Lo que quiero saber es cuál es la mejor práctica en el manejo de la memoria en C? No hay clases con constructores/destructores para manejar esto por mí. ¿Es bueno asignar memoria al comienzo de una función o usar una función que la cree para mí? ¿Y cómo debería liberarlos de nuevo?
Estas son preguntas amplias y difieren de una situación a otra, pero ¿cómo prefiere manejarlo? ¿Qué consejos y lecciones puedes dar?
No necesita el molde (excepto cuando pasa directamente una llamada malloc() como un argumento de función varargs o usando compiladores ANSI previos). Eso en realidad está induciendo malos habits porque oculta un #include faltante. –
dirkgently
+1 para malloc/free en el mismo ámbito y para p = NULL después de free(). malloc/free en el mismo ámbito es una buena localización, y tenga en cuenta que "haga su trabajo" puede incluir llamadas a funciones que toman punteros. La mejor respuesta de lejos en este momento. – dwc
eso es otra cosa estilística, Dirk. Prefiero tener el elenco explícito, porque eso es parte de mi propio razonamiento de tipo que paso mientras escribo C. Veo "(char *) malloc" como un funcionamiento abstracto que devuelve un trozo de memoria malloc'ed. –