我想知道为什么valgrind
说:
==9952== 30 bytes in 6 blocks are definitely lost in loss record 1 of 1
==9952== at 0x4C2BF0E: realloc (vg_replace_malloc.c:662)
==9952== by 0x40131F: setCharsPositions (paramsExec.c:99)
==9952== by 0x400CF3: main (main.c:87)
我不知道我的
realloc()
有什么问题(你不必说每次重新分配一个内存是低效的……);变量char **passwordSet2
是全局的-也许这就是问题所在。。。如果我做错了什么,请告诉我!我要疯了!void setCharsPositions(char *charsPos){
int i, k;
char *posStr = NULL;
for(i = 0; i < strlen(charsPos); i++){
posStr = malloc(sizeof(char));
if(charsPos[i] == '['){
for(k = 0, i++; charsPos[i] != ','; i++, k++){
posStr[k] = charsPos[i];
posStr = realloc(posStr, (k+2)*sizeof(char));
}
posStr[k] = '\0';
passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));
for(k = 0, i++; charsPos[i] != ']'; i++, k++){
passwordSet2[atoi(posStr)-1][k] = charsPos[i];
passwordSet2[atoi(posStr)-1] = realloc(passwordSet2[atoi(posStr)-1], (k+2)*sizeof(char));
}
passwordSet2[atoi(posStr)-1][k] = '\0';
}
free(posStr);
}
}
最佳答案
passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));
如果先前分配了
passwordSet2[atoi(posStr)-1]
,则会泄漏内存。也就是说,如果posStr的相同值出现多次,则会发生泄漏。失去的记忆将来自之前的一次重新分配,所以这是瓦尔格林将报告的。(如果你指出哪一行是第662行,这会有帮助。)如果posStr的相同值出现了不止一次,但不应该出现,那么你需要检查一下。如果允许多次发生,则应添加对free
的调用:free(passwordSet2[atoi(posStr)-1]);
passwordSet2[atoi(posStr)-1] = malloc(sizeof(char));
当
free
为空时,passwordSet2[atoi(posStr)-1]
的第一次出现是no-op。另外,您不会检查malloc和realloc的空返回,尽管这些返回会导致程序崩溃,而不仅仅是泄漏。
最后,为了清晰和可能的效率,我建议您将a to I(posStr)-1放入一个变量中,而不是重复它。