考虑这个案例:
使用 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,所以我无法在泄漏之外测试它。
是的,退出时你的记忆就会丢失。
当您创建
static
指针时,它只会分配 32 或 64 位(取决于您的操作系统)来存储它指向的地址。
因此,当您将堆上分配的内存分配给
static
指针时,它会就像存储一个代表分配的第一个字节的内存地址的 int
。
当你的程序退出时,它只会“释放”存储的内存地址,而不是它的目标。