我的任务是创建一个函数,该函数接收可变数量的参数,并释放所有参数,任何类型的参数。
我尝试使用可变参数函数来执行此操作,但事实是我不知道参数的类型。
有什么建议怎么做吗?
最佳答案
将每个指针视为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);
}
这将在单个函数调用中释放所有已分配的内存,而不管是否分配了
p5
或p6
(或者是否有其他分配失败)。但是,这超出了限制。但是,在这种设计中,至关重要的是不要在第一个空指针处停止,以防万一列表中后面有非空指针。关于c - 释放可变参数函数中的所有参数-c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14746053/