0

问题是我无法释放它,控制台输出指针在 free 函数内部是相同的,当 realloc 调用时,xcode 在函数 StringList_add 的行中检测到。

typedef struct stringlist_s {
        int max_str;
        char **str;
}stringlist_t;

//functions
stringlist_t *StringList_new()
{
    stringlist_t *lst = (stringlist_t *)malloc(sizeof(stringlist_t));

    return lst;
}

void StringList_add(stringlist_t *str_list,char *str)
{
    if(!str)
        return;
    if(!str_list)
        return;

    str_list->str = (char **)realloc(str_list->str, sizeof(char *)  * (str_list->max_str+1));

    str_list->str[str_list->max_str] = (char *)malloc(strlen(str) + 1);

    memcpy(str_list->str[str_list->max_str], str, strlen(str) + 1);

    str_list->max_str++;
}

void StringList_release(stringlist_t *strList)
{
    if(!strList) {
        printf("Releasing empty pointer\n");
         return;
    }

    for(int i = 0 ; i < strList->max_str; ++i )
    {
        free(strList->str[i]);
        printf("pointer inside is %p\n",strList->str[i]);
    }

    printf("list before is  %p\n",strList);
    free(strList);
    printf("list  now is %p\n",strList);  //value is the same as previous printf

}

我只是用它来测试上面的代码:

stringList_t *a = StringList_new();
StringList_add(a,"abc");
StringList_add(a,"edf");
StringList_release(a);
4

1 回答 1

4

一个问题是StringList_new()分配一个新的stringList_t但从不初始化它的成员。致电realloc()

str_list->str = (char **)realloc(str_list->str, sizeof(char *)  * 
    (str_list->max_str+1));

既没有str_list->strstr_list->max_str没有被初始化。从参考页面realloc()

它必须事先由 malloc()、calloc() 或 realloc() 分配,并且尚未用 free() 释放,否则,结果是未定义的。

与未初始化的指针一起使用时会出现这种情况。

改成:

stringlist_t *StringList_new()
{
    stringlist_t *lst = malloc(sizeof(*lst));
    lst->max_str = 0;
    lst->str     = NULL;

    return lst;
}

不要强制转换malloc()or的返回值realloc()。传递一个NULL指针realloc()很好,它的行为就像malloc()在这种情况下一样。当使用realloc()将返回值存储在临时指针变量中以避免realloc()失败时的内存泄漏时:

char** tmp = realloc(str_list->str, sizeof(*tmp)  * (str_list->max_str+1));
if (tmp)
{
    str_list->str = tmp;
}

注意我没有按照 C 标准使用calloc()所有StringList_new()位零不需要表示空指针。

于 2012-10-16T17:58:13.857 回答