避免内存泄露
2.2 ID_memoryLeak
动态分配的内存地址不可被遗失,否则相关内存无法被访问也无法被回收,这种问题称为“内存泄漏(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)