个人而言,我有一个资源跟踪库(基本上是一棵平衡二叉树),并且我对所有分配函数进行了包装。
资源(例如内存、套接字、文件描述符、信号量等——任何你分配和释放的东西)可以属于一个集合。
我还有一个错误处理库,其中每个函数的第一个参数都是一个错误集,如果出现问题,遇到错误的函数会将错误提交到错误集中。
如果错误集包含一个错误,则不执行任何函数。(我在每个函数的顶部设置了一个宏,使其返回)。
因此,多个malloc看起来像这样;
mem[0] = malloc_wrapper( error_set, resource_set, 100 );
mem[1] = malloc_wrapper( error_set, resource_set, 50 );
mem[2] = malloc_wrapper( error_set, resource_set, 20 );
不需要检查返回值,因为如果发生错误,后续的函数都不会执行,例如下面的malloc永远不会发生。
所以,当我需要释放资源时(比如在一个函数的结尾处,该函数内部使用的所有资源都已经被放入一个集合中),我只需要调用一个函数即可。
res_delete_set( resource_set );
我不需要专门检查错误——我的代码中没有if()语句检查返回值,这使得它易于维护;我发现内联错误检查的增多破坏了可读性和可维护性。我只有一个漂亮简洁的函数调用列表。
这就是艺术,伙计 :-)