C / Glib cadenas que deben ser liberados por la persona que llama
Pregunta
Estoy utilizando simplista, España
que tiene una gran cantidad de funciones que devuelven cadenas que deben ser liberados a mí mismo.
puede, pasar Me estas funciones a otras funciones?
Ejemplo: function1 devuelve una cadena que debe ser liberado de la persona que llama. function2 devuelve un puntero a una cadena que debe ser liberado también.
gchar *string = function2(function1("something"));
g_free (string);
¿Cómo debería liberar la cadena de regresar de function1? Es necesario?
Muchas gracias,
y lo siento por mi Inglés
Solución
Si es necesario liberar la cadena devuelta por function1
. Para permitir que hagas esto, es necesario tener una copia del valor de retorno: -
gchar* temp = function1("something");
gchar* string = function2(temp);
g_free(temp);
g_free(string);
Otros consejos
En el ejemplo que das:
gchar *string = function2(function1("something"));
g_free (string);
no puede liberar la cadena de function1()
. Esta es una pérdida de memoria. Así, mientras que sé que es bueno para comprimir las cosas, se debe reducir la velocidad:
gchar *temp, *string;
temp = function1("something");
string = function2(temp);
g_free(temp);
temp = NULL;
g_free(string);
De lo contrario, cada vez que el código se ejecuta, function1()
será la asignación de más memoria que nunca se liberó, y si la aplicación se ejecuta durante mucho tiempo, su programa se iniciará lentamente el funcionamiento de memoria disponible (debido a todo lo que asigna memoria que Nunca se free()
d).
Otra alternativa es escribir una envoltura alrededor de function2()
:
gchar *function2_wrapper(gchar *c)
{
gchar *ret = function2(c);
free(c);
return ret;
}
gchar *string = function2_wrapper(function1("something"));
Sin embargo, en mi opinión eso es probablemente más esfuerzo que vale la pena, y cualquiera que busque en su código se puede perder, creo que hay una pérdida de memoria cuando no la hay, y volver a escribir y ser golpeado con un error de doble free()
en tiempo de ejecución y no tienen idea de lo que está pasando,
Sí, es cierto, como @DaveRigby y otros son señaló a cabo, que se necesita para obtener el valor del puntero regresar de function1()
para liberarla. Pero hay grandes si
Si usted se refiere funciones simplistas como g_string_append()
como function1()
, debe no liberarla. Debido a que esas funciones devuelven lo que ha pasado sucesivamente.
Digamos que usted tiene
GString *s = g_string_new("foo");
y que desea tener "http://foo/bar"
, que puede hacer:
s = g_string_prepend(g_string_append(s, "/bar"), "http://");
use_my_string(s);
g_string_free(s);
Sé que el ejemplo anterior no es la mejor, pero espero que puedan ver el punto. funciones de la tanga se puede decir destructiva . No crea una copia de cadenas dadas.