【发布时间】:2017-06-19 20:05:09
【问题描述】:
char **add_string(char **existing, const char *string){
size_t size = 0;
while (NULL != existing[size])
{
++size;
}
char **arr = realloc(existing, (size + 2) * sizeof *arr);
arr[size] = malloc(strlen(string) + 1);
strcpy(arr[size], string);
arr[size+1] = '\0';
return arr;
}
void free_strings(char **strings)
{
size_t size = 0;
while (NULL != strings[size])
{
free(strings[size]);
++size;
}
}
我在行发生内存泄漏
char **arr = realloc(existing, (size + 2) * sizeof *arr);
我认为在使用 realloc 时应该释放现有内存?如何修复此内存泄漏?
编辑:添加了我的 free_string 函数和我用来运行程序的 main。
【问题讨论】:
-
稍后释放数组的代码在哪里?泄漏检查工具可能会指出分配泄漏内存的位置,但它无法向您显示应该释放它的位置......这可能是缺少的。如果
realloc()成功,它要么给你相同的块,要么释放旧的块并分配一个新的块......但你仍然需要在稍后的某个时候释放新的(或重用的)块。 -
你为什么用 (size+2) 而不是 (size+1)?
-
@odin 他获取大小的方式不包括最终的 NULL 指针......所以他必须为 NULL 添加 2、1 和为新字符串添加 1。尽管他应该将最后一个指针设置为
NULL而不是'\0' -
@Dmitri 我添加了我的释放功能和我正在使用的主要功能。
-
您的释放函数会释放数组中的字符串,但不会释放外部数组本身......这就是它泄露的原因。将
free(strings);添加到末尾应该可以解决它。
标签: c string memory-leaks realloc