在定义一个资源变量标识时,应赋予初始表分配失败的错误值(如常见的NULL)。
每次向系统申请资源或调用功能接口时,判断其错误处理,如结果失败goto跳转到函数末尾将对程序当前获取的所有资源进行统一释放。
函数末尾返回前,有一段代码将依次释放所有已分配或占有的设备资源,释放前应先判断变量是否有效,释放后标记资源变量为无效值。这条规则同样适用于任何时候对资源的释放。这样做的好处,一来只对已分配拥有的资源进行清理释放,同一资源不会重复释放,二变量能正确反映资源状态,不存在野指针这种情况。
统一释放时应按分配的逆顺释放,如时间上先分配资源了A、B、C、D,那么集中释放资源时的顺序则为D、C、B、A,从依赖关系结构上来说,前者一定不依赖后者,而后者有可能对前者存在某种关系。
典型的free释放的安全宏定义如下:
#define SAFE_FREE(p) if(p){free(p);p=NULL;}