动态分配一个cstrings数组来分隔传递它的字符串。 Valgrind说我有7个分配但只有3个自由。但我不确定如何在使用返回数组的函数时释放内存。
这是函数
char ** func( char * str, char del ) {
char** substrings;
char* word;
int len = 0, capacity = 2, i, x;
substrings = malloc(sizeof(char*) * (capacity + 1));
for (i = 0; i <= capacity; i++){
substrings[i] = NULL;
}
while (*word != '\0') {
if (len >= capacity){
/* double size */
char **temp;
capacity *= 2;
temp = malloc(sizeof(char*) * (capacity + 1));
for (i = 0; i < len; i++) {
temp[i] = substrings[i];
}
for (i = len; i <= capacity; i++) {
temp[i] = NULL;
}
substrings = temp;
temp = NULL;
free(temp);
}
}
return substrings;
}
答案 0 :(得分:0)
从您的代码中
if (len >= capacity){
/* double size */
char **temp;
capacity *= 2;
temp = malloc(sizeof(char*) * (capacity + 1));
for (i = 0; i < len; i++) {
temp[i] = substrings[i];
}
for (i = len; i <= capacity; i++) {
temp[i] = NULL;
}
free(substrings); // release old memory
substrings = temp; // this line causes substrings pointer leak if you assign new address to it without free
temp = NULL;
free(temp); // no need free NULL
}
实际上,如果您将 valgrind 与 - track-originins = yes 选项一起使用,它将报告该线路正在泄漏。
答案 1 :(得分:0)
两件事。
1)我认为您提供的程序不是您在申请中使用的程序。我看到多个问题,例如,word
未初始化。
2)正如其他人指出的那样,问题是因为你为指针分配NULL然后释放它。
从代码中看起来您正在尝试执行以下操作。
for (i = len; i <= capacity; i++) {
/* Your code */
}
/* Free the previous substring. */
if(NULL != substrings){
free(substrings);
}
/* Save newly allocated temp as substring. */
substrings = temp;
/* Clear temp variable - Optional. */
temp = NULL;