c - 在 C 循环中使用 asprintf 时发生内存泄漏

标签 c memory-management memory-leaks

我有一段代码,看起来像这样

#include <stdio.h>
int main()
{
    int i;
    int number_of_chunks = 12;
    char *final_string = NULL;

    for(i = 0; i < number_of_chunks; i++) 
    {
        char *chunk = some_hash_table.pop(i);
        asprintf(&final_string, "%s%s", (final_string==NULL?"":final_string), chunk);
    }
    free(final_string);
    return 0;
}

这里我动态连接字符串 block ,这意味着我事先不知道每个 block 的大小。为此,我使用 asprintf。该代码工作正常,但是会出现一些严重的内存问题。我的疑问是 asprintf 在每次迭代中分配内存,并且代码在每次迭代中丢失指针。如果有任何其他方法可以在循环内连接字符串,请指导我

最佳答案

为了以最简单的方式提出你的问题,你基本上想要用上面的代码做的是
1. 连续为指针分配内存(在您的情况下,在 for 循环中分配 12 次)和
2.最后只释放一次,导致内存泄漏。

就像下面的代码

#include <stdio.h>
int main()
{
    int i;
    int number_of_chunks = 12;
    char *final_string = NULL;

    for(i = 0; i < number_of_chunks; i++) 
    {
        /*For example: similar to what asprintf does, allocate memory to the pointer*/
        final_string = malloc(1);
    }
    free(final_string);
    return 0;
}

从上面的示例中可以很容易地看出,您已经分配了内存 12 次,但只释放了一次。

代码片段:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{  
    int i;
    int number_of_chunks = 12;
    char *final_string = NULL;
    char *tmp = NULL;

    for(i = 0; i < number_of_chunks; i++)
    {
        char *chunk = some_hash_table.pop(i);
        asprintf(&final_string, "%s%s", (tmp==NULL?"":tmp), chunk);
        if (tmp)
            free(tmp);
        tmp = final_string;
    }

    printf("%s\n", final_string);
    free(final_string);
    return 0;
}

关于c - 在 C 循环中使用 asprintf 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32600152/

相关文章:

c - 尝试缓冲 malloc() 分配的溢出值

ios - 我从 UIImagePickerControllerSourceTypeCamera 拍照后内存泄漏

c++ - 为什么我得到 "double free or corruption"?

iphone - MKMapView initWithFrame 不使用 ARC 释放内存

c++ - 网络摄像头校准

c - Mico C 虚拟机分段故障

c++ - 如何强制 Windows 向所有应用程序发送 'LOW_MEMORY' 信号?

C GOTO 命令创建无限循环

c - 将单词嵌入数组。 boolean 问题。

Calloc - 内存分配