Valgrind Rapporten Fout Invalid read of size 8
in de volgende code.
Ik heb een array zoals,
struct symbol *st[PARSER_HASH_SIZE];
Wanneer mijn programma is geïnitialiseerd, zijn alle elementen in deze array ingesteld als 0.
memset(&st[0], 0, sizeof(st));
Mijn programma maakt gevallen van struct symbol
en voegt in de bovenstaande array, afhankelijk van de hash-waarde. Zo weinig van de elementen in deze array zullen null en anderen zijn geldige waarde.
De volgende code probeert de toegewezen items te verwijderen en Valgrind klaagt op de lijn,
sym = st[i]; sym != NULL; sym = sym->next
struct symbol *sym = NULL;
/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
free(sym);
}
}
Ik probeer de reden voor deze fout te begrijpen.
Elke hulp zou geweldig zijn!
Antwoord 1, Autoriteit 100%
Het probleem is dat u de sym
bevrijd, en vervolgens probeert toegang te krijgen tot een waarde van de (nu-vrijgegeven) gegevens: sym->next
.
U wilt waarschijnlijk iets dergelijks voor de binnenlus:
struct symbol *next_sym = NULL;
for(sym = st[i]; sym != NULL; ) {
next_sym = sym->next;
free(sym);
sym = next_sym;
}
Antwoord 2, Autoriteit 6%
Het is ook niet duidelijk of u array moet worden bedoeld om structuren of aanwijzers te bevatten om
te structureren
struct symbol *st[PARSER_HASH_SIZE];
zegt dat het een reeks verwijzingen naar structs is. Maar dan zeg je
“Als mijn programma wordt geïnitialiseerd, worden alle elementen in deze array als 0 gestart.”
memset(&st[0], 0, sizeof(st));
Dit behandelt de items als structs
doe om de array te wissen
for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
st[i] = 0;
}