位于静态变量上的 Malloc 内存分配指针被自动释放还是真的存在泄漏?

问题描述 投票:0回答:1

考虑这个案例:

使用 macOS 泄漏 -atExit -- 有以下代码:

#include <stdlib.h>
int main(void)
{
    char *leak = malloc(100);
    return (0);
}

这自然是一个泄漏...“leaks -atExit”正确报告。然后考虑这个:

#include <stdlib.h>
int main(void)
{
    static char *test = NULL;

    char *leak = malloc(100);
    test = leak;
    return (0);
}

现在“leaks -atExit”报告没有泄漏。那么这是怎么回事?

静态指针最后会自动释放吗?不管是否在堆上?或者...这确实是一个泄漏,所以它只是“泄漏工具”无法检测?

如果能真正知道发生了什么就好了……谢谢!

由于系统限制(旧的catalina系统),我无法访问-fsanitize=leaks,也无法访问valgrind,所以我无法在泄漏之外测试它。

c memory-leaks heap-memory static-memory-allocation
1个回答
1
投票

是的,退出时你的记忆就会丢失。

说明:

当您创建

static
指针时,它只会分配 32 或 64 位(取决于您的操作系统)来存储它指向的地址。

因此,当您将堆上分配的内存分配给

static
指针时,它会就像存储一个代表分配的第一个字节的内存地址的
int

当你的程序退出时,它只会“释放”存储的内存地址,而不是它的目标。

© www.soinside.com 2019 - 2024. All rights reserved.