gpt4 book ai didi

c - Valgrind 输出理解

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:27 25 4
gpt4 key购买 nike

==20420== 
==20420== HEAP SUMMARY:
==20420== in use at exit: 0 bytes in 1 blocks
==20420== total heap usage: 1 allocs, 0 frees, 0 bytes allocated
==20420==
==20420== Searching for pointers to 1 not-freed blocks
==20420== Checked 48,492 bytes
==20420==
==20420== 0 bytes in 1 blocks are still reachable in loss record 1 of 1
==20420== at 0x400677E: malloc (vg_replace_malloc.c:195)
==20420== by 0x80483D8: main (jig.c:10)
==20420==
==20420== LEAK SUMMARY:
==20420== definitely lost: 0 bytes in 0 blocks
==20420== indirectly lost: 0 bytes in 0 blocks
==20420== possibly lost: 0 bytes in 0 blocks
==20420== still reachable: 0 bytes in 1 blocks
==20420== suppressed: 0 bytes in 0 blocks

在我的项目中看到我是这样使用 malloc 的:

malloc(sizeof(some_structure) * some_expression);

有一次 some_expression 给出了值 0,所以我在间接地做

   malloc(0)

因此,当我不打算 malloc 单个字节时,我不会释放它,但在这种情况下,valgrind 会显示内存泄漏。为什么?

编辑:

如果我这样使用:

char *a = malloc(0);

那么a不为NULL。所以问题是为什么不为 NULL? & 它存储哪个地址?

最佳答案

来 self 的 malloc(3) 联机帮助页 (Linux):

If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

所以不能保证 malloc 在你传递 0 时不会分配任何空间,如果不是,你必须 free 它给你的指针NULL.

如果 malloc 不返回 NULL,您将获得一个不能用于任何用途的缓冲区,但由于它具有唯一地址,malloc 必须至少分配一个字节。

也许您想用一个 to 替换 malloc 调用

// like malloc, but guarantees NULL return value if n==0
void *malloc0(size_t n)
{
return n ? malloc(n) : NULL;
}

关于c - Valgrind 输出理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com