libérer de la mémoire allouée

gcc 4.4.5 c89

J’ai une fonction appelée create_object où j’alloue de la mémoire pour une structure globale. Et j’ai une fonction appelée destroy_object où je vérifie que le pointeur n’est pas nul, puis je libère. Juste si je libère de la mémoire qui n’a pas été allouée. Cependant, j’ai testé cela en effectuant 2 appels consécutifs à destroy_object. Cependant, je reçois un vidage de stack au deuxième appel. Cependant, je suis sûr que cela ne serait pas libre car j’ai assigné le pointeur à NULL. Donc, il devrait sauter la fonction libre.

static struct Config_t { char protocol[LINE_SIZE]; char mode[LINE_SIZE]; } *app_cfg = NULL; int create_object() { app_cfg = malloc(sizeof *app_cfg); memset(app_cfg, 0, sizeof *app_cfg); } void destroy_config() { /* Check to see if the memory is ok to free */ if(app_cfg != NULL) { free(app_cfg); app_cfg = NULL; } } 

Merci beaucoup pour vos suggestions,

================ EDIT =========== À la base, j’ai dans ma fonction principale un appel à create_object () et je fais un traitement, puis appel à destory_object.

 int main(void) { create_object(); /* Do some processing on the structure */ destroy_object(); return 0; } 

========================= Final Edit ==== Structure statique Config_t {char protocol [LINE_SIZE]; mode char [LINE_SIZE]; } app_cfg [1] {{“”, “”}};

Et maintenant je n’utilise pas malloc et gratuit.

Je n’ai qu’une suggestion. Ne pas allouer de mémoire pour cela, c’est une perte de temps.

Comme app_cfg est une variable de niveau fichier, vous ne pouvez de toute façon disposer que d’une copie à la fois. Il est donc app_cfg de l’allouer et de la désaffecter.

Créez-le simplement en tant que pointeur non statique et utilisez-le:

 static struct Config_t { char protocol[LINE_SIZE]; char mode[LINE_SIZE]; } app_cfg; 

Vous pouvez toujours fournir un create et destroy ce qui memset la structure à zéros mais même cela peut ne pas être requirejs:

 void create_object (void) { memset(&app_cfg, 0, sizeof(app_cfg)); } void destroy_config (void) { memset(&app_cfg, 0, sizeof(app_cfg)); } 

L’utilisation de ce code avec gcc 3.3.3 sous Cygwin fonctionne correctement pour moi lorsque je l’appelle deux fois. Vous ne nous avez pas dit ce que vous faisiez en dehors de ces fonctions, alors regardez-y d’abord, par exemple, vous atsortingbuez accidentellement une valeur non-NULL à app_cfg entre deux appels. De plus, si vous n’utilisez pas un compilateur “grand nom”, il est possible qu’il s’agisse d’un bogue du compilateur (par exemple, il peut être trop optimiste au moment de la compilation et supposer que vous ne passerez jamais un NULL à destroy_config). Essayez de mettre quelque chose comme:

 void destroy_config() { /* Check to see if the memory is ok to free */ if(app_cfg != NULL) { printf("not null\n" ); free(app_cfg); app_cfg = NULL; }else{ printf("null\n" ); } } 

pour voir s’il “sait” vraiment quand c’est nul.