亲自; 我有一个资源跟踪库(基本上是一个平衡的二叉树),并且我有所有分配函数的包装器。
资源(例如内存、套接字、文件描述符、信号量等——您分配和释放的任何东西)都可以属于一个集合。
我还有一个错误处理库,其中每个函数的第一个参数是一个错误集,如果出现问题,遇到错误的函数会将错误提交到错误集中。
如果错误集包含错误,则不执行任何函数。(我在每个函数的顶部都有一个宏,它会导致它返回)。
所以多个 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()s 检查返回值,这使得它可以维护;我发现内联错误检查的泛滥破坏了可读性和可维护性。我只有一个很好的简单的函数调用列表。
这是艺术,伙计:-)