gcc的malloc属性是如何使用的?

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

我不太确定我是否正确理解

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
中分配的内存被泄漏。
我做错了什么?

c gcc gcc-warning
1个回答
0
投票

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