J'essaie d'utiliser une liste chaînée de structures dans C, avec une structure représentant la liste et une autre représentant les membres de la liste. C'est leur définition:Erreurs d'exécution lors de l'utilisation de Free() dans C
typedef struct symEntry symEntry;
struct symEntry{
const char * key;
const void * value;
struct symEntry * next;
struct symEntry * linked;
struct symEntry * previous;
};
typedef struct{
symEntry* head;
symEntry* tail;
int size;
} symTab;
typedef symTab * SymTab;
Et mon problème est quand j'essaie de libérer la mémoire que j'alloue. J'allouez tout cela et revenir struct de la liste comme ceci:
SymTab ST_new()
{
SymTab oSymTab = (SymTab)malloc(sizeof(SymTab));
symEntry * head = (symEntry *)malloc(sizeof(symEntry));
head->key = NULL;
head->value = NULL;
head->previous = NULL;
head->linked = NULL;
oSymTab->head = head;
oSymTab->size = 0;
ST_fill(oSymTab, sizeArray[currentSize]);
return oSymTab;
}
void ST_fill(SymTab oSymTab, int size)
{
symEntry * current;
current = oSymTab->head;
int i;
for(i = 0; i < size-1; i++)
{
symEntry * entry = (symEntry *)malloc(sizeof(symEntry));
entry->key = NULL;
entry->value = NULL;
entry->linked = NULL;
entry->previous = current;
current->next = entry;
current = current->next;
}
current->next = NULL;
oSymTab->tail = current;
}
Ainsi, initialisant la tête et initialisant alors tous les éléments en fonction de la taille que je veux que la liste soit. Définissez next et previous, de sorte que previous soit null au début et next soit null à la fin. Mon problème commence vraiment lorsque je tente de libérer la mémoire dans une fonction séparée après qu'il a été utilisé:
void ST_free(SymTab oSymTab)
{
symEntry * current;
symEntry * previous;
current = oSymTab->head;
while(current->next != NULL)
{
previous = current;
current= current->next;
free(previous);
}
free(oSymTab);
}
Si je commente sur les déclarations gratuitement le code fonctionne sans problème (j'ai couru des opérations sur le struct après le remplissage avec des valeurs vides et il a zéro problème), donc cette configuration n'a pas de problèmes jusqu'à ce que j'essaie de libérer la mémoire. J'ai parfois des erreurs d'exécution, peut-être 50% du temps.
Je n'ai vraiment aucune idée de ce que le problème est, en particulier lorsque le code s'exécute sans problème à certains moments et échoue à d'autres. Est-ce que quelqu'un pourrait me guider?
S'il vous plaît poster a [MCVE] –
Devrions-nous * deviner * ce qu'est un 'SymTab' (par opposition à un' symTab')? – WhozCraig
Vous devez produire un exemple complet; quelque chose que nous pouvons compiler et exécuter, et voir l'erreur se produire. Il est probable que le problème ne soit pas dans le code que vous avez publié. – davmac