c中的简单字符串列表正在泄漏内存(malloc和realloc)
问题是我无法释放它,控制台输出指针在free函数中是相同的,调用realloc时在函数StringList\u add的行中检测到xcodec中的简单字符串列表正在泄漏内存(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(
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我后来做了重新定位,