C asprint内存泄漏需要帮助了解泄漏的来源和可能的修复方法
注意:我确实调用了这个函数并将其释放为main,但valgrind仍然显示错误。 这段代码基本上接受一个带有两个数据系数和经验的单链表。这基本上是将链表中的多项式存储转换为可读字符串。我希望有它的动态分配C asprint内存泄漏需要帮助了解泄漏的来源和可能的修复方法,c,memory-leaks,asprintf,C,Memory Leaks,Asprintf,注意:我确实调用了这个函数并将其释放为main,但valgrind仍然显示错误。 这段代码基本上接受一个带有两个数据系数和经验的单链表。这基本上是将链表中的多项式存储转换为可读字符串。我希望有它的动态分配 char *Poly_to_string(const Polynomial *p) { char *x = malloc(1); int size; while (p != NULL) { if((p->exp != 0) &&a
char *Poly_to_string(const Polynomial *p)
{
char *x = malloc(1);
int size;
while (p != NULL)
{
if((p->exp != 0) && (p->exp != 1))
{
size = asprintf(&x, "%s%dx^%d + ", x, p->coeff, p->exp);
if (size == -1)
{
exit(-1);
}
}
else if(p->exp == 1)
{
size = asprintf(&x, "%s%dx + ", x, p->coeff);
if (size == -1)
{
exit(-1);
}
}
else if(!p->exp)
{
size = asprintf(&x, "%s%d + ", x, p->coeff);
if (size == -1)
{
exit(-1);
}
}
p = p->next;
}
x[strlen(x) - 3] = '\0';
return x;
}
您没有从(粗体显示的)中取消分配变量x: 说明 函数
asprintf()
和vasprintf()
与
sprintf(3)
和vsprintf(3)
,除了它们分配一个字符串
大到足以容纳输出,包括终止null
字节('\0'),并通过第一个参数返回指向它的指针。
应该将该指针传递到free(3)以释放分配的
不再需要时进行存储
返回值
成功时,这些函数返回字节数
打印,就像sprintf(3)一样。如果内存分配不正确
可能,或发生其他错误时,这些函数将返回
-1,strp
的内容未定义
这一行是错误的:
char *x = malloc(1);
应该是
char *x;
因为如果asprintf()
工作,它将覆盖x
的内容,并导致在char*x=malloc(1)中分配的内存代码>将被泄漏
编辑
在尝试增加字符串时,还需要解决循环问题:
char *Poly_to_string(const Polynomial *p)
{
// start with an empty string that can be free()'d
// (if you don't have strdup() use malloc() and strcpy())
char *x = strdup("");
int size;
while (p != NULL)
{
// save the old malloc()'d value so it can be free()'d
char *oldValue = x;
if((p->exp != 0) && (p->exp != 1))
{
size = asprintf(&x, "%s%dx^%d + ", x, p->coeff, p->exp);
if (size == -1)
{
exit(-1);
}
}
else if(p->exp == 1)
{
size = asprintf(&x, "%s%dx + ", x, p->coeff);
if (size == -1)
{
exit(-1);
}
}
else if(!p->exp)
{
size = asprintf(&x, "%s%d + ", x, p->coeff);
if (size == -1)
{
exit(-1);
}
}
// free() the old value
free(oldValue);
p = p->next;
}
x[strlen(x) - 3] = '\0';
return x;
}
还有其他方法可以在不使用首字母char*x=strdup(“”)的情况下实现这一点代码>但是代码会变得更加复杂。在这方面,我是否需要在将内容移动到另一个变量后释放x?如果是这样的话,我想这就是我缺乏知识和智慧的地方,这方面的一些建议会对我有帮助。但是内存泄漏仍然存在,因为它是一个链表,所以您也在多个多项式*p
上循环。您需要在x
中保留旧指针的副本,并在每次迭代后释放它。我第一次看你的代码时就错过了。谢谢。你的帮助解决了我的几个问题。非常感谢。仍然有一些漏洞,但已经取得了进展!我想知道每一条语句之间的x是否导致了主要的泄漏问题,我不知道是怎么回事,但我想这只是整个代码的一部分。Valgrind应该告诉你泄漏的内存是从哪里分配的。