La función g_malloc posibilita la reserva
de una zona de memoria, con un número de bytes que le pasemos
como parámetro. Además, también existe una función similar
llamada g_malloc0 que, no sólo reserva
una zona de memoria, sino que, además, llena esa zona de
memoria con ceros, lo cual nos puede beneficiar si se necesita
un zona de memoria totalmente limpia.
gpointer g_malloc ( | numero_de_bytes ) ; | |
gpointer g_malloc0 ( | numero_de_bytes ) ; | |
Existe otro conjunto de funciones que nos permiten reservar
memoria de una forma parecida a cómo se hace en los lenguajes
orientados a objetos. Esto se realiza mediante las siguientes
macros definidas en GLib™ /gmem.h:
/* Convenience memory allocators
*/
#define g_new(struct_type, n_structs) \
((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
#define g_new0(struct_type, n_structs) \
((struct_type *) g_malloc0 (((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
#define g_renew(struct_type, mem, n_structs) \
((struct_type *) g_realloc ((mem), ((gsize) sizeof (struct_type)) * ((gsize) (n_structs))))
Como se puede apreciar, no son más que macros basadas en
g_malloc, g_malloc0
y g_realloc. La forma de funcionamiento
de g_new y g_new0 es
mediante el nombre de un tipo de datos y un número de
elementos de ese tipo de datos, de forma que se puede hacer:
GString *str = g_new (GString,1);
GString *arr_str = g_new (GString, 5);
En estas dos líneas de código, se asigna memoria para un
elemento de tipo GString, que queda almacenado en
la variable str, y para un array de cinco
elementos de tipo GString, que queda almacenado
en la variable arr_str).
g_new0 funciona de la misma forma que
g_new, con la única diferencia de que
inicializa a 0 toda la memoria asignada. En cuanto a
g_renew, ésta funciona de la misma forma
que g_realloc, es decir, reasigna la
memoria asignada anteriormente.
Cuando se hace una reserva de memoria con
g_malloc y, en un momento dado, el uso de
esa memoria no tiene sentido, es el momento de liberar esa
memoria. Y el sustituto de free es
g_free que, básicamente, funciona igual
que la anteriormente mencionada.
void g_free ( | memoria_reservada ) ; | |
gpointer | memoria_reservada ; |
Realojamiento de memoria.
En determinadas ocasiones, sobre todo cuando se utilizan
estructuras de datos dinámicas, es necesario ajustar el tamaño
de una zona de memoria (ya sea para hacerla más grande o más
pequeña). Para eso, GLib™ ofrece la
función g_realloc, que recibe un puntero
a memoria que apunta a una región que es la que será acomodada
al nuevo tamaño y devuelve el puntero a la nueva zona de
memoria. El anterior puntero es liberado y no se debería
utilizar más:
gpointer g_realloc ( | memoria_reservada , | |
| numero_de_bytes ) ; | |
gpointer | memoria_reservada ; |
gulong | numero_de_bytes ; |