【发布时间】:2013-11-30 11:04:17
【问题描述】:
我无法弄清楚我在这里做错了什么。一般是 valgrind 和 C 的新手,但已经设法清理了我所有的内存泄漏,除了这个
==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;
}
我可以看到我没有释放一些东西,但我不知道在哪里释放它(调用函数还是本地??)以及我应该释放的究竟是什么?
帮助?
谢谢
编辑:
这是调用函数的代码。我不知道我还需要释放什么,尝试了一些不同的东西,但结果变得更糟,最后在这里发帖。
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被分配了strfree()ed 离开时tokenize. -
@alk true,但所有输入都包含
,