我正在做一个学校项目,老师要求我们在项目结束时释放所有资源.
我正在努力寻找一种方法来编写更易读和/或更少的代码来管理这一点,特别是考虑到不同的出口点可能会有不同的资源集可供释放,这使得这一点变得更加复杂.
最简单、最混乱的解决方案似乎是这样(出口点表示为返回-1的"Some_sys_call"调用):
char *a = malloc(1);
if(some_sys_call() == -1){
free(a);
return -1;
}
//b is needed until the end
char *b = malloc(1);
if(some_sys_call() == -1){
free(a);
free(b);
return -1;
}
//c is needed until the end
char *c = malloc(1);
//a is no longer needed from here on, so it's freed right away
free(a);
if(some_sys_call() == -1){
free(b);
free(c);
return -1;
}
//Exit point when there are no errors
free(b);
free(c);
return 0;
这似乎不是很有吸引力,原因很明显:您需要编写大量代码,特别是当您拥有大量资源时,这会使代码变得过于臃肿,而且可读性较差. 当然,您不能简单地编写一个宏或函数来释放所有资源并在每个出口点调用它,如下所示:
#define free_all free(a); \
free(b); \
free(c);
从技术上讲,您可以为每组自由定义不同的宏/函数:
#define free_1 free(a);
#define free_2 free(a); \
free(b);
...
这将使"实际"代码更具可读性,但仍需要您编写许多不同的宏,在我看来也不是一个好的解决方案.
这被认为是一个常见的问题吗?这通常是怎么处理的?