我的任务是创建一个函数,该函数接收可变数量的参数,并释放所有参数,任何类型的参数。
我尝试使用可变参数函数来执行此操作,但事实是我不知道参数的类型。

有什么建议怎么做吗?

最佳答案

将每个指针视为void *;将其传递给free()

void free_anything(void *arg1, ...)
{
    va_list args;
    void *vp;
    free(arg1);
    va_start(args, arg1);
    while ((vp = va_arg(args, void *)) != 0)
        free(vp);
    va_end(args);
}


示例调用:

free_anything(p1, p2, p3, p4, (void *)0);


另一种设计将要释放的参数数量计数作为第一个参数传递:

free_everything(4, p1, p2, p3, p4);


替代功能的实现留给练习...



请注意,带有计数器(free_everything())的设计可能更好。您可以编写一个以以下方式清理多个分配的函数:

void memory_intensive(int size)
{
    int *p1 = malloc(size * sizeof(*p1));
    char *p2 = malloc(size * 32);
    struct wotnot *p3 = malloc(sizeof(*p3));
    struct onemore *p4 = malloc(size * sizeof(*p4));
    struct later *p5 = 0;
    struct muchlater *p6 = 0;

    if (some_condition(p1, p3, size))
    {
        p5 = malloc(size * sizeof(*p5));
        ...
    }
    if (another_condition(p2, p4, size))
    {
        p6 = malloc(size * sizeof(*p6));
        ...
    }

    free_everything(6, p1, p2, p3, p4, p5, p6);
}


这将在单个函数调用中释放所有已分配的内存,而不管是否分配了p5p6(或者是否有其他分配失败)。但是,这超出了限制。但是,在这种设计中,至关重要的是不要在第一个空指针处停止,以防万一列表中后面有非空指针。

关于c - 释放可变参数函数中的所有参数-c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14746053/

10-13 07:55
查看更多