前言
没有 Java 中垃圾回收机制,也没有 Rust 中的编译期类型检查机制,C/C++ 要求开发人员自己管理内存(合理申请内存,并及时归还),确保内存安全是应用程序开发者的责任。
C/C++ 程序中各种因内存产生的错误大致有以下几种情况,这些错误一般出现在程序运行期间,有些错误一旦出现,往往是“致命”的。
以下示例使用 C 语言风格,其中大部分实例将 malloc/realloc
替换成 new
, free
替换成 delete
可以阐释 C++ 中类似的操作效果。
Bad Free (BAF)
企图释放没有申请的内存,即非堆区内存(non-heap block)。例如:
{
char foo[4];
char* bar = &foo[0];
/* bad free */
free(bar); // or
// realloc(bar);
}
Duplicate Free (DUF)
企图释放已经被释放的堆中内存,即重复释放内存。例如:
{
char* foo = (char*)malloc(32); // success
free(foo);
free(foo); /* duplicate free */
}
Memory Leak (MEL)
申请的内存未被释放,且应用程序中不存在改内存块的引用。例如:
void func() {
char* foo = (char*)malloc(32); // success
strcpy(foo, "hello world");
return;
}
// or
{
char* foo = (char*)malloc(32); // success
//... no free
foo = NULL;
}
Misaligned Free (MAF)
企图释放部分堆区内存。例如:
{
char* foo = (char*)malloc(32); // success
foo++;
free(foo); // invalid pointer
}
Out of Memory (OOM)
企图申请过大的内存,且未检测是否申请成功。例如:
{
char* foo = (char*)malloc(0xfffffffffff);
// Out of Memory, foo will be NULL
// badly use `foo`
}