C中的简单字符串列表正在泄漏内存(malloc和realloc)



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

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 pointern");
         return;
    }
    for(int i = 0 ; i < strList->max_str; ++i )
    {
        free(strList->str[i]);
        printf("pointer inside is %pn",strList->str[i]);
    }
    printf("list before is  %pn",strList);
    free(strList);
    printf("list  now is %pn",strList);  //value is the same as previous printf
}

我只是使用它来测试上述代码:

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

一个问题是StringList_new()分配新的stringList_t,但从未初始化IT成员。在致电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()分配,并且尚未免费()释放,否则,结果不确定。

与单位化指针一起使用时,这将是这种情况。

更改为:

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

不要施放malloc()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;
}

注意,我没有在StringList_new()中使用calloc(),因为根据C标准,所有位零都不代表零指针。

相关内容

  • 没有找到相关文章

最新更新