Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C asprint内存泄漏需要帮助了解泄漏的来源和可能的修复方法_C_Memory Leaks_Asprintf - Fatal编程技术网

C asprint内存泄漏需要帮助了解泄漏的来源和可能的修复方法

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

注意:我确实调用了这个函数并将其释放为main,但valgrind仍然显示错误。 这段代码基本上接受一个带有两个数据系数和经验的单链表。这基本上是将链表中的多项式存储转换为可读字符串。我希望有它的动态分配

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应该告诉你泄漏的内存是从哪里分配的。