Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Surfaces y Memoria

4 views
Skip to first unread message

Cristian Segura

unread,
Dec 27, 2007, 8:36:41 AM12/27/07
to SDL en Español
Estimados usuarios de SDL, les tengo una nueva consulta que espero no
les resultará demasiado obvia.

Mi consulta es la siguiente:

Tengo entendido que cuando se llama una función, las variables creadas
dentro de ella se alojan en un sector de la memoria especial (stack,
pila según tengo entendido), y luego al terminar la ejecución de la
función este espacio de memoria se libera automáticamente.

Desde este punto de vista no sería necesario hacer un
SDL_FreeSurface() para las surfaces cargadas dentro de dicha función,
ya que de todas maneras el Sistema Operativo (WinXP en este caso)
debería liberar automáticamente la memoria utilizada.

¿Estoy en lo correcto? alguien puede darme información o links donde
pueda obtener información más extensa del tema.

Feliz Navidad y un Feliz Año Nuevo!!!!

Cristian Segura

Roberto Albornoz

unread,
Dec 27, 2007, 12:28:18 PM12/27/07
to sdl...@googlegroups.com
Efectivamente las variables locales creadas dentro de un bloque (una función por ejemplo), solo se mantendrán "vivas" en su ámbito.

Pero ojo, cuando reservas memoria dinámica, esta existirá hasta que la liberes tu manualmente. Es lo que sucede por ejemplo al cargar una superficie, ten cuenta que la función IMG_Load o SDL_LoadBMP devuelven un puntero a SDL_Surface, lo que significa que internamente esta función esta reservando la memoria (probablemente con malloc), por lo tanto debes eliminar posteriormente esta memoria, no tiene porque ser en la misma función, todo depende de lo que quieras hacer. Pero ojo debes mantener guardada una copia desde ese puntero, para liberarlo cuando sea necesario.

Si aun tienes problema con tu función de carga de imágenes, podrías pegar el código exacto que estás usando.

Volviendo a lo que dijo alguien mas de la lista, es posible que estés pasando parámetros por valor y no por referencia. Si quieres crear una función que modifica un puntero a SDL_Surface, tendrías que crear una función que tome como parámetro un puntero a puntero a SDL_Surface.

Saludos.

Roberto Albornoz

unread,
Dec 27, 2007, 1:21:26 PM12/27/07
to sdl...@googlegroups.com
Te dejo el siguiente enlace, para que leas sobre el stack y el heap:

http://www.zator.com/Cpp/E1_3_2.htm

Saludos.

ay...@linuxlover.org

unread,
Dec 27, 2007, 6:37:28 PM12/27/07
to sdl...@googlegroups.com

Creo que hay un problema de concepto aquí... Si tu función recibe un
puntero a SDL_Surface, y haces algo sobre dicho puntero recibido dentro de
la función. El original será modificado, precisamente para eso son los
punteros. Tú a la función le estarás pasando una posición de memoria
donde está guardado el dato original. No hace falta puntero a puntero para
nada...


> Saludos.
>
>

Message has been deleted

Roberto Albornoz

unread,
Dec 27, 2007, 6:49:10 PM12/27/07
to sdl...@googlegroups.com

Creo que hay un problema de concepto aqu�... Si tu funci�n recibe un
puntero a SDL_Surface, y haces algo sobre dicho puntero recibido dentro de
la funci�n. El original ser� modificado, precisamente para eso son los
punteros. T� a la funci�n le estar�s pasando una posici�n de memoria
donde est� guardado el dato original. No hace falta puntero a puntero para
nada...


Así es, si recibe un puntero a un tipo T, la función podrá modificar su dirección. De hecho el paso de parámetros por referencia se hace con punteros, eso está clarísimo. Pero yo me refería al problema inicial que tenia Cristian, el trabajaba con un arreglo de puntero a SDL_Surface, por eso suponiendo que se tiene una función que toma como parámetro el arreglo, este debe ser un puntero a puntero a SDL_Surface, para poder acceder a cada posición del arreglo y modificar la dirección de memoria cuando se vaya cargando cada superficie.

Es decir, queremos generar un arreglo de tamaño n, donde cada posición almacene un puntero a SDL_Surface.

SDL_Surface **images;
int n = 10; // Supongamos que son 10

void LoadSurfaces(SDL_Surface **images, int total)
{
 // ...aquí el código para crear el arreglo, y cargar las imágenes
}

 Saludos. 

Cristian Segura

unread,
Dec 28, 2007, 9:44:05 AM12/28/07
to SDL en Español
Gracias por su respuestas y por el link.

Algunas observaciones:
- Cuando me refería a cargar superficies dentro de funciones lo hacía
con la finalidad de que dichas funciones NO TOMEN como argumento
arrays de surfaces o punteros a surfaces (SDL_Surface **ppSuperficie,
por ejemplo),sino que todas las superficies se cargan dentro de la
función y cuando la función termina no se usan más en el programa
principal. La idea es crear funciones para manipular etapas o
secciones independientes de un juego.
- Roberto tiene razón en lo de la función IMG_Load, si ella utiliza la
función malloc(), es imprescindible liberar la memoria mediante algun
SDL_FreeSurface ya que malloc crea variables en la seccion HEAP de la
memoria y no en el STACK, es decir, no se liberan automaticamente.
Reply all
Reply to author
Forward
0 new messages