【问题标题】:Memory leak | LeakSanitizer: detected memory leaks | C programming内存泄漏 | LeakSanitizer:检测到内存泄漏 | C 编程
【发布时间】:2021-09-01 22:07:59
【问题描述】:

我不明白为什么会发生下面的内存泄漏,以及如何避免它。

我正在使用 malloc 分配内存,并通过循环启动分配的内存,将字符串a中的值逐个复制到字符串b

就我的理解而言,我不会留下任何没有使用的记忆。

我的代码:

#include <stdlib.h>

void    run_test_one(void)
{
    char    *a;
    char    *b;
    int     i;

    a = "up the irons";
    b = (char *)malloc(13 * sizeof(char));
    i = 0;
    while(a[i] != '\0')
    {
        b[i] = a[i];
        ++i;
    }
    b[i] = '\0';
}

int main(void)
{
    run_test_one();

    return (0);
}

错误:

==9003==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 13 byte(s) in 1 object(s) allocated from:
    #0 0x7ffb28c1db40 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb40)
    #1 0x55a9533b29c6 in run_test_one test.c:10
    #2 0x55a9533b2b04 in main test.c:22
    #3 0x7ffb2876fbf6 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21bf6)

SUMMARY: AddressSanitizer: 13 byte(s) leaked in 1 allocation(s).

【问题讨论】:

  • “泄漏”是指您创建或分配资源,但不销毁或释放它。就像你打电话给malloc 但从不打电话给free。那是泄漏。
  • IOW:在 b[i] = '\0'; 行之前添加 free(b);
  • @Jabberwocky 之后 我想你的意思是...... :)

标签: c memory-leaks malloc


【解决方案1】:

无论使用与否,malloc 都会分配内存。要修复泄漏,您需要释放内存。

#include <stdlib.h>

void    run_test_one(void)
{
    char    *a;
    char    *b;
    int     i;

    a = "up the irons";
    b = (char *)malloc(13 * sizeof(char));
    i = 0;
    while(a[i] != '\0')
    {
        b[i] = a[i];
        ++i;
    }
    b[i] = '\0';
    // new code
    free(b)
    // 
}

int main(void)
{
    run_test_one();

    return (0);
}

第二种解决方案是使用自动分配。程序离开 run_test_one 函数后,内存被释放:

#include <stdlib.h>

void    run_test_one(void)
{
    char    *a;
    char    *b;
    int     i;

    a = "up the irons";
    //edit
    char b[13];
    //
    i = 0;
    while(a[i] != '\0')
    {
        b[i] = a[i];
        ++i;
    }
    b[i] = '\0';
}

int main(void)
{
    run_test_one();

    return (0);
}

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2021-11-29
    • 2012-07-16
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多