Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的简单字符串列表正在泄漏内存(malloc和realloc)_C_Xcode_Malloc - Fatal编程技术网

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

c中的简单字符串列表正在泄漏内存(malloc和realloc),c,xcode,malloc,C,Xcode,Malloc,问题是我无法释放它,控制台输出指针在free函数中是相同的,调用realloc时在函数StringList\u add的行中检测到xcode typedef struct stringlist_s { int max_str; char **str; }stringlist_t; //functions stringlist_t *StringList_new() { stringlist_t *lst = (stringlist_t *)malloc(

问题是我无法释放它,控制台输出指针在free函数中是相同的,调用realloc时在函数StringList\u 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 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\u new()
分配一个新的
StringList\u t
,但从不初始化它的成员。调用
realloc()

未初始化
str\u list->str
str\u list->max\u str
。从以下内容的参考页:

它必须是以前由malloc()、calloc()或realloc()分配的,并且还不能用free()释放,否则,结果是未定义的

与统一化指针一起使用时会出现这种情况

改为:

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\u new()
中使用
calloc()
,因为根据C标准,所有零位都不需要表示空指针。

一个问题是
StringList\u new()
分配一个新的
StringList\u t
但从不初始化它的成员。调用
realloc()

未初始化
str\u list->str
str\u list->max\u str
。从以下内容的参考页:

它必须是以前由malloc()、calloc()或realloc()分配的,并且还不能用free()释放,否则,结果是未定义的

与统一化指针一起使用时会出现这种情况

改为:

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;
}

注:根据C标准,我没有在
StringList_new()
中使用
calloc()
,所有零位不需要表示空指针。

使用
valgrind
gdb
调试内存泄漏,或者使用Boehm的保守垃圾收集器(即用
GC\u malloc
等替换
malloc
printf(“现在的列表是%p\n”,strList)//值与以前的printf
相同,这是正常的,
空闲
使用指针通常不会更改指针指向的地址,您只是不能在
空闲
和指向某个有效内存之间取消引用它。使用
valgrind
gdb
调试内存泄漏,或者使用Boehm的保守垃圾收集器(即用
GC\u malloc
等替换
malloc
printf(“现在的列表是%p\n”,strList)//值与以前的printf
相同,这是正常的,
空闲
使用指针通常不会更改指针指向的地址,只是不能在
空闲
之间取消引用它,并将其指向某个有效内存。抱歉,max_str只是一个输入错误,应该是int而不是int*,关于str我后来重新指定了它,抱歉max_str只是一个输入错误,应该是int而不是int*,关于str我后来做了重新定位,