☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

资源的分配与回收方法应成对提供

2.5 ID_incompleteNewDeletePair
目录 › next › previous

资源的分配和回收方法应在同一库或主程序等可执行模块、类等逻辑模块中提供。

如果一个模块分配的资源需要另一个模块回收,会打破模块之间的独立性,增加维护成本,而且 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
};

相关

ID_memberDeallocation ID_crossModuleTransfer ID_incompatibleDealloc

参考

C++ Core Guidelines R.15 SEI CERT DCL54-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.