在 C 中从 void 指针进行转换时如何释放内存

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

问题:如果我有一个指向“ints”结构的指针(如下所示)并将其转换为 void 并返回,这是否意味着我不再允许释放它? free 如何跟踪分配大小?

typedef struct ints
{
    int size;              
    int *data;       
}
ints;

static void dev_array_cleanup(void *array, array_type type)
{
    switch(type)
    {
        case INT: 
        ints *i = (ints*) array; 
        free(i->data);
        free(i); 
        i = NULL; 
        break;
    }
}

static void* dev_array_set(void *array, int size, array_type type)
{
    void *p;

    switch(type) 
    {
        case INT: 
            ints *i = (ints*) malloc(sizeof(ints));
            i->size = size; 
            i->data = (int*) malloc(size * sizeof(int)); 
            p = (void*) i;
            break;
    }

    return p;
}
c pointers memory free void
1个回答
0
投票

我不能再释放它了?

是的,您可以

free
。事实上,你必须(最终)
free
它才能避免内存泄漏。

free
不关心指针指向的类型 - 它接受
void*

并且任何指针都可以转换为
void*

因此,您可以简单地在指针上调用
free
(无论是否强制转换)。

free 如何跟踪分配大小?

这是由运行时库内部完成的,不依赖于类型。

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