无法解决此c程序中的内存管理(valgrind)

标签 c memory-leaks valgrind

我的问题如下。我必须创建一个 C 程序,将输入中的所有参数连接到一个缓冲区中,然后返回该缓冲区。我的解决方案有效,但存在内存管理问题。

如何解决这个问题?

#define RIALLOCA(buf, newsize) buf = realloc(buf, newsize);

char *mystrcat(char *buf, size_t sz, char *first, ...) {
    va_list l;
    va_start(l, first);

    buf = malloc(strlen(buf) + 1);

    if (sz < strlen(first) + 1) {
        sz += (strlen(first) + 1);
    }

    RIALLOCA(buf, sz + 1 + 16);
    strncat(buf, first, strlen(first));

    char *nextString = va_arg(l, char *);

    while (nextString != NULL) { 
        // sz += strlen(nextString);
        RIALLOCA(buf, strlen(buf) + strlen(nextString) + 1 + 16);
        strncat(buf, nextString, strlen(nextString));
        nextString = va_arg(l, char *);
    }   

    va_end(l);

    return buf;
}   

int main(int argc, char *argv[]) {
    if (argc != 7) {
        printf("troppi pochi argomenti\n");
        return -1; 
    }   
    char *buffer = NULL;
    RIALLOCA(buffer, 16);  // macro che effettua l'allocazione
    buffer[0] = '\0';
    buffer = mystrcat(buffer, 16, argv[1], argv[2], argv[3], argv[4], argv[5],
                      argv[6], NULL);
    printf("%s\n", buffer);
    free(buffer);     
    return 0;
}

这是 Valgrind 的问题

enter image description here

最佳答案

问题是 - 当您在 mystrcat() 内调用 buf = malloc() 时 - 您会导致内存泄漏。内存已在 main() 中为 buf 动态分配。

改变

buf = malloc(strlen(buf)+1);

buf = realloc(buf, strlen(buf) + 1);

另外...我同意 user3629249 的观点:以您所做的方式为标准库函数提供宏似乎是多余的 - 至少在这种情况下。

关于无法解决此c程序中的内存管理(valgrind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56515194/

相关文章:

c - 链表冒泡排序

c - 当超出堆(裸机)时,malloc() 不会返回 null

在以下代码中找不到一个字节的内存泄漏

c - 如何释放临时字符串的内存?

c - 仍然可以通过 put 和 printf 访问

c++ - Trimesh - 泄漏内存

c - C中的可选输入

c - 打开 .txt 文件进行写入时出现段错误

java - 对 WeakReference.get() 对象的硬引用会导致内存泄漏吗?

c++ - 为什么Callgrind使原子负载永无止境