2010-06-12 16 views
5

Je vais appeler une fonction Vala de C, et j'ai une question sur la gestion de la mémoire. La fonction ressemble à ceci dans Vala:Gestion de la mémoire Vala

int[] GetNumbers(); 

et est traduit par valac à C comme celui-ci

gint* GetNumbers(int* result_length1); 

Lorsque la fonction ci-dessus est appelée à partir de C, est l'appelant responsable de la libération du tableau gint* ?

Répondre

6

Une question Vala! C'est cool!

Vala a une option utile -C qui vous permet de jeter un coup d'œil au code C généré. Cette fonction, par exemple ...

int[] GetNumbers() { 
    return new int[] {1,2,3}; 
} 

... si compilé avec ...

valac -C -c test.vala 

... révèlera le C-code suivant (en test.c) ...

gint* GetNumbers (int* result_length1) { 
    gint* result = NULL; 
    gint* _tmp0_ = NULL; 
    gint* _tmp1_; 
    result = (_tmp1_ = (_tmp0_ = g_new0 (gint, 3), _tmp0_[0] = 1, _tmp0_[1] = 2, _tmp0_[2] = 3, _tmp0_), *result_length1 = 3, _tmp1_); 
    return result; 
} 

Notez le g_new0; Donc oui, vous voulez g_free.

Même si vous ne faites que passer par le fichier d'en-tête, et que vous ne pouvez pas regarder toutes les implémentations, les mêmes règles s'appliquent en C: si ce n'est pas const, libérez-le.