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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?