我正在开展一个学校项目,老师要求我们在项目终止时释放所有资源。
我正在努力寻找一种方法来编写更具可读性和/或更少的代码来管理它,特别是考虑到不同的退出点可能会释放不同的资源集,这使得这变得更加复杂。
最简单和最混乱的解决方案似乎是这样的(退出点表示为返回 -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;
Run Code Online (Sandbox Code Playgroud)
由于显而易见的原因,这似乎不太吸引人:您需要编写大量代码,尤其是当您拥有大量资源时,这会导致代码因释放而变得臃肿且可读性较差。当然,您不能简单地编写一个宏或函数来释放所有资源并在每个退出点调用它,如下所示:
#define free_all …Run Code Online (Sandbox Code Playgroud) 我想知道实现这一目标的最简单、最便携且普遍认为的最佳实践,适用于任何数字。我还希望与数字关联的字符串采用十进制表示形式,如果可能的话,不使用科学记数法。