我有一段代码,看起来像这样
#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/