资源的分配与回收方法应成对提供
2.5 ID_incompleteNewDeletePair
资源的分配和回收方法应在同一库或主程序等可执行模块、类等逻辑模块中提供。
如果一个模块分配的资源需要另一个模块回收,会打破模块之间的独立性,增加维护成本,而且 so、dll、exe 等可执行模块的资源管理机制可以是相互独立的,跨模块的分配与回收可能会造成严重错误。
示例:
// In a.dll
int* foo() {
return (int*)malloc(1024);
}
// In b.dll
void bar() {
int* p = foo();
....
free(p); // Non-compliant, may crash
}
设例中 a.dll 和 b.dll 用于动态内存管理的数据结构是各自私有的,相关算法也不一样,如果 a.dll 分配的内存被 b.dll 释放,就会造成严重错误。
应改为:
// In a.dll
int* foo_alloc() {
return (int*)malloc(1024);
}
void foo_dealloc(int* p) {
free(p);
}
// In b.dll
void bar() {
int* p = foo_alloc();
....
foo_dealloc(p); // Compliant
}
修正后 a.dll 成对提供分配回收函数,b.dll 配套使用这些函数,避免了冲突。
类等逻辑模块提供了分配方法,也应提供回收方法,如重载了 new 运算符,也应重载相应的 delete 运算符:
class A {
void* operator new(size_t); // Non-compliant, missing ‘operator delete’
};
class B {
void operator delete(void*); // Non-compliant, missing ‘operator new’
};
class C {
void* operator new(size_t); // Compliant
void operator delete(void*); // Compliant
};