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

避免内存泄露

2.2 ID_memoryLeak
目录 › next › previous

动态分配的内存地址不可被遗失,否则相关内存无法被访问也无法被回收,这种问题称为“内存泄漏(memory leak)”,会导致可用内存被耗尽,使程序无法正常运行。

程序需要保证内存分配与回收之间的流程可达,且不可被异常中断,相关线程也不可在中途停止。

本规则是 ID_resourceLeak 的特化。

示例:

void foo(size_t n) {
    void* p = malloc(n);
    if (cond) {
        return;  // Non-compliant, ‘p’ is lost
    }
    ....
    free(p);
}

例中局部变量 p 记录已分配的内存地址,释放前在某种情况下函数返回,之后便再也无法访问到这块内存了,导致内存泄漏。

又如:

void bar(size_t n) {
    void* p = malloc(n);
    if (n < 100) {
        p = realloc(p, 100);  // Non-compliant, ‘p’ may be lost
    }
    ....
}

当 realloc 函数分配失败时会返回空指针,p 指向的原内存空间不会被释放,但 p 被赋值为空,导致内存泄漏,这是一种常见错误。

在 C++ 语言中,将资源托管于类对象,将资源管理简化为对象管理,避免在复杂的流程分枝中手工分配回收资源是 C++ 程序设计的重要准则,也是避免资源泄露的有效措施,可参见 ID_ownerlessResource 的进一步介绍。

相关

ID_resourceLeak ID_ownerlessResource ID_throwInConstructor ID_memberDeallocation ID_multiAllocation ID_exceptionUnsafe

依据

ISO/IEC 9899:1999 7.20.3(1) ISO/IEC 9899:2011 7.22.3(1) ISO/IEC 14882:2003 3.7.3.1(2) ISO/IEC 14882:2003 3.7.4.1(2)

参考

CWE-401 C++ Core Guidelines P.8 C++ Core Guidelines E.13
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.