0
点赞
收藏
分享

微信扫一扫

C/C++ 编程中常见的内存错误

小月亮06 2022-01-09 阅读 85

前言

没有 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`
}
举报

相关推荐

0 条评论