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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top