我的使命是创建一个函数,该函数接收可变数量的参数并释放所有参数,对于任何类型的参数。我试图使用可变参数函数来实现,但问题是我不知道参数的类型。有什么建议吗?
2lpgd9681#
将每个指针视为void *;将其传递给free():
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);
替代函数的实现也很简单:
void free_anything(size_t n, ...) { va_list args; va_start(args, n); for (size_t i = 0; i < n; i++) { void *vp = va_arg(args, void *); free(vp); } va_end(args); }
注意,带有计数器(free_everything())的设计可能更好;你可以写一个函数来清理函数中的多个分配:
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(或者是否有任何其他分配失败)。然而,这是在扩展限制。然而,在这样的设计中,关键是不要在第一个空指针处停止......以防列表中后面有非空指针。
p5
p6
1条答案
按热度按时间2lpgd9681#
将每个指针视为
void *
;将其传递给free()
:示例调用:
另一种设计是传入要释放的参数数量的计数作为第一个参数:
替代函数的实现也很简单:
注意,带有计数器(
free_everything()
)的设计可能更好;你可以写一个函数来清理函数中的多个分配:这在一个函数调用中释放了所有分配的内存,而不管是否分配了
p5
或p6
(或者是否有任何其他分配失败)。然而,这是在扩展限制。然而,在这样的设计中,关键是不要在第一个空指针处停止......以防列表中后面有非空指针。