我不太确定我是否正确理解
gcc
的 malloc
属性。
例如,看一下这个程序:
#include <stdio.h>
#include <stdlib.h>
__attribute__((returns_nonnull, malloc, malloc(free, 1)))
void *safe_malloc(size_t n)
{
void *memory = malloc(n);
if (memory == NULL)
{
fprintf(stderr, "failed: malloc(%zu)\n", n);
exit(EXIT_FAILURE);
}
return memory;
}
typedef struct
{
size_t n, capacity;
int *elements;
} array_list;
__attribute__((nonnull))
void free_array_list(array_list *lst)
{
if (lst->elements != NULL)
{
free(lst->elements);
}
free(lst);
}
__attribute__((returns_nonnull, malloc, malloc(free_array_list, 1)))
array_list *new_array_list()
{
array_list *lst = safe_malloc(sizeof(array_list));
lst->elements = NULL;
lst->capacity = 0;
lst->n = 0;
return lst;
}
int main(void)
{
array_list *lst = new_array_list();
free_array_list(lst);
return EXIT_SUCCESS;
}
我的理解是这样的
__attribute__((..., malloc, malloc(free_array_list, 1)))
malloc
意味着 new_array_list
返回类似于 malloc 的新内存,并且 malloc(free_array_list, 1)
的意思是,new_array_list
返回的内存应该由free_array_list
释放。与初始化器和析构器非常相似,
new_array_list
返回的内容稍后应由free_array_list
清理。
但是如果你用 -fanalyzer
编译这段代码(我尝试过 gcc 版本 11.3.0
和 12.3.0
),则警告表明 new_array_list
中分配的内存被泄漏。我做错了什么?