Я не могу понять, что я сделал неправильно здесь. Новое в VALGRIND и C в целом, но удалось очистить все мои утечки MEM, кроме этого одногоОшибка утечки памяти
==8749== HEAP SUMMARY:
==8749== in use at exit: 880 bytes in 11 blocks
==8749== total heap usage: 80 allocs, 69 frees, 5,620 bytes allocated
==8749==
==8749== 400 bytes in 5 blocks are definitely lost in loss record 1 of 2
==8749== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8749== by 0x402B1C: tokenize (tm_utility.c:78)
==8749== by 0x402E57: load_data (tm_utility.c:188)
==8749== by 0x400D0A: main (tm.c:57)
==8749==
==8749== 480 bytes in 6 blocks are definitely lost in loss record 2 of 2
==8749== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8749== by 0x402B1C: tokenize (tm_utility.c:78)
==8749== by 0x402C97: load_data (tm_utility.c:147)
==8749== by 0x400D0A: main (tm.c:57)
==8749==
Это относится к этой функции:
char** tokenize(const char* input)
{
char* str = (char*)strdup(input);
int count = 0;
int capacity = 10;
char** result = malloc(capacity*sizeof(*result)); /*LINE 78*/
char* tok=strtok(str,",");
while(1)
{
if (count >= capacity)
result = realloc(result, (capacity*=2)*sizeof(*result));
result[count++] = tok? strdup(tok) : tok;
if (!tok) break;
tok=strtok(NULL,",");
}
free(str);
return result;
}
Я могу видеть, что я не свободна» d что-то есть, но я не могу понять, где его освободить (вызов функции или локально?), и что именно я должен освободить?
Помощь?
Благодаря
EDIT:
Вот код из вызывающей функции. Я не мог понять, что мне нужно, чтобы освободиться, попробовал несколько разных вещей, но только сделал это хуже и закончил публикацию здесь.
while (fgets(line, sizeof(line), coinsfile_stream) != NULL)
{
tokens = tokenize(line);
for(i=tokens; i && *i; ++i)
{
if(y==0)
{
tm->coins[x].denomination = atoi(*i);
y=1;
x++;
}
else
{
tm->coins[z].count = atoi(*i);
y=0;
z++;
}
free(*i);
}
}
Если в 'input' нет' '', то код возвращает недопустимую ссылку в качестве первого элемента, так как ему присваивается 'tok', которому были присвоены' str', а 'str' -' free() ' ed при выходе из 'tokenize'. – alk
@alk true, но все входные данные содержат ',' – Chris