如何解决asprint 内存泄漏需要帮助了解泄漏的来源和可能的修复
注意:我确实调用了这个函数并将其释放为 main 但 valgrind 仍然显示错误。 这段代码基本上采用了一个带有两个数据 coeff 和 exp 的单链表。这基本上是将链表中的多项式存储转换为可读字符串。我希望动态分配它。
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 + ",p->coeff);
if (size == -1)
{
exit(-1);
}
}
else if(!p->exp)
{
size = asprintf(&x,"%s%d + ",p->coeff);
if (size == -1)
{
exit(-1);
}
}
p = p->next;
}
x[strlen(x) - 3] = '\0';
return x;
}
解决方法
来自 Linux asprintf()
man page(我的粗体):
描述
函数 asprintf()
和 vasprintf()
类似于
sprintf(3)
和 vsprintf(3)
,除了 他们分配一个字符串
大到足以容纳包括终止空值在内的输出
byte('\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 + ",p->coeff);
if (size == -1)
{
exit(-1);
}
}
else if(!p->exp)
{
size = asprintf(&x,"%s%d + ",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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。