gpt4 book ai didi

c - 在 C 循环中使用 asprintf 时发生内存泄漏

转载 作者:行者123 更新时间:2023-11-30 18:53:37 24 4
gpt4 key购买 nike

我有一段代码,看起来像这样

#include <stdio.h>
int main()
{
int i;
int number_of_chunks = 12;
char *final_string = NULL;

for(i = 0; i < number_of_chunks; i++)
{
char *chunk = some_hash_table.pop(i);
asprintf(&final_string, "%s%s", (final_string==NULL?"":final_string), chunk);
}
free(final_string);
return 0;
}

这里我动态连接字符串 block ,这意味着我事先不知道每个 block 的大小。为此,我使用 asprintf。该代码工作正常,但是会出现一些严重的内存问题。我的疑问是 asprintf 在每次迭代中分配内存,并且代码在每次迭代中丢失指针。如果有任何其他方法可以在循环内连接字符串,请指导我

最佳答案

为了以最简单的方式提出你的问题,你基本上想要用上面的代码做的是
1. 连续为指针分配内存(在您的情况下,在 for 循环中分配 12 次)和
2.最后只释放一次,导致内存泄漏。

就像下面的代码

#include <stdio.h>
int main()
{
int i;
int number_of_chunks = 12;
char *final_string = NULL;

for(i = 0; i < number_of_chunks; i++)
{
/*For example: similar to what asprintf does, allocate memory to the pointer*/
final_string = malloc(1);
}
free(final_string);
return 0;
}

从上面的示例中可以很容易地看出,您已经分配了内存 12 次,但只释放了一次。

代码片段:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i;
int number_of_chunks = 12;
char *final_string = NULL;
char *tmp = NULL;

for(i = 0; i < number_of_chunks; i++)
{
char *chunk = some_hash_table.pop(i);
asprintf(&final_string, "%s%s", (tmp==NULL?"":tmp), chunk);
if (tmp)
free(tmp);
tmp = final_string;
}

printf("%s\n", final_string);
free(final_string);
return 0;
}

关于c - 在 C 循环中使用 asprintf 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32600152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com