2009-08-18 7 views
3

J'utilise glib,
il a beaucoup de fonctions qui retournent des chaînes qui devraient être libérées moi-même. Puis-je passer ces fonctions à d'autres fonctions?C/Glib Chaînes qui devraient être libérées par l'appelant

Exemple:function1 retourne une chaîne qui doit être libéré pour l'appelant. function2 renvoie un pointeur sur une chaîne qui doit également être libérée.

gchar *string = function2(function1("something")); 
g_free (string); 

Comment libérer la chaîne retournée par function1? Est-ce nécessaire?

Merci beaucoup,
et désolé pour mon anglais

+0

Nous pouvons voir dans la page principale et la page de question si une question a été répondue ou fermée, vous n'avez pas besoin de changer le titre de la question. –

Répondre

6

Oui, il est nécessaire de libérer la chaîne retournée par function1. Pour vous permettre de le faire, vous devez prendre une copie de la valeur de retour: -

gchar* temp = function1("something"); 
gchar* string = function2(temp); 
g_free(temp); 
g_free(string); 
3

Dans l'exemple que vous donnez:

gchar *string = function2(function1("something")); 
g_free (string); 

Vous ne peut pas gratuitement la chaîne de function1() . C'est une fuite de mémoire. Ainsi, alors que je sais qu'il est agréable de compresser les choses, vous devez ralentir:

gchar *temp, *string; 
temp = function1("something"); 
string = function2(temp); 
g_free(temp); 
temp = NULL; 
g_free(string); 

Sinon, chaque fois que le code est exécuté, function1() sera allouer plus de mémoire qui n'est jamais libéré, et si votre application fonctionne depuis longtemps , votre programme commencera lentement à manquer de mémoire disponible (à cause de toute la mémoire allouée qui n'est jamais free() d).

Une autre alternative est d'écrire un wrapper autour function2():

gchar *function2_wrapper(gchar *c) 
{ 
    gchar *ret = function2(c); 
    free(c); 
    return ret; 
} 

gchar *string = function2_wrapper(function1("something")); 

Mais à mon avis, c'est probablement plus d'efforts que cela vaut la peine, et ceux qui cherchent à votre code peut être perdu, pense qu'il ya une fuite de mémoire lorsque il n'y a pas, et réécrire et se faire frapper avec une erreur double free() à l'exécution et n'ont aucune idée de ce qui se passe,

1

Oui, il est vrai, comme @DaveRigby et d'autres sont pointed sur, que vous devez obtenir la valeur du pointeur retourné de function1() pour le libérer. Mais il y a grand si!

Si vous faites référence à des fonctions glib comme g_string_append() comme function1(), vous devriez pas le libérer. Parce que ces fonctions renvoient ce que vous avez transmis.

Disons que vous avez

GString *s = g_string_new("foo"); 

et vous voulez avoir "http://foo/bar", vous pouvez faire:

s = g_string_prepend(g_string_append(s, "/bar"), "http://"); 
use_my_string(s); 
g_string_free(s); 

Je sais l'exemple ci-dessus n'est pas le meilleur mais nous espérons que vous pouvez voir le point .Les fonctions GString peuvent être dites destructive. Il ne crée pas de copie des chaînes données.

Questions connexes