gcc 4.4.5 C89mémoire allouée libération
J'ai une fonction appelée create_object où j'allouer 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, alors je suis libre. Juste au cas où 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, j'obtiens un vidage de pile au deuxième appel. Cependant, je suis sûr qu'il ne serait pas libre car j'ai assigné le pointeur à NULL. Donc, il devrait ignorer la fonction gratuite.
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;
}
}
Un grand merci pour toutes les suggestions,
================= ========== EDIT Basicially J'ai en Ma fonction principale est un appel à create_object() et je fais un traitement, puis je fais un appel à destory_object.
int main(void)
{
create_object();
/* Do some processing on the structure */
destroy_object();
return 0;
}
========================= final Edit ==== statique struct {Config_t protocole char [LINE_SIZE]; mode char [LINE_SIZE]; } app_cfg [1] {{"", ""}};
Et maintenant je n'utilise pas malloc et gratuit.
Cela me semble bien, pouvez-vous poster le code qui utilise ce pointeur et fait des appels à 'create_object' et' destroy_config'? De plus, si vous voulez initialiser immédiatement votre mémoire allouée à 'app_cfg' à 0s, vous pouvez combiner vos appels' malloc' et 'memset' en un seul appel' calloc'. De même, 'free' sur un pointeur nul est parfaitement correct. – birryree
Passer un pointeur null à 'free()' est un no-op sûr, donc vous n'avez pas besoin de la vérification null dans 'destroy_config()'. – Wyzard
êtes-vous en mesure d'exécuter le code via gdb et regarder le backtrace après que le SIGSEGV est soulevée? Indique-t-il un autre endroit dans votre programme? – vpit3833