嵌入式八股,内存泄漏
1. 什么是内存泄漏?
内存泄漏是指程序中动态分配的内存没有被正确释放,导致这部分内存无法被系统重新使用。随着时间的推移,泄漏的内存会不断累积,最终可能导致以下问题:
-
程序占用的内存不断增加,消耗系统资源。
-
系统可用内存减少,可能导致其他程序运行缓慢甚至崩溃。
-
在极端情况下,可能导致程序崩溃或系统死机。
内存泄漏通常发生在动态内存分配的场景中,例如使用C语言中的 malloc
、calloc
、realloc
,或C++中的 new
分配内存,但没有通过 free
或 delete
释放内存。
2.内存泄漏情况细分
细分可分为三种情况。
(1)忘记释放内存
这是最常见的内存泄漏原因。例如:
void func() {
int* ptr = malloc(sizeof(int)); // 分配内存
*ptr = 10;
// 忘记调用 free(ptr);
}
每次调用 func()
,都会分配一块内存,但从未释放,导致内存泄漏。
(2)指针被覆盖
在某些情况下,指针的值被意外覆盖,导致无法访问原始分配的内存,从而无法释放。例如:
int* ptr = malloc(sizeof(int));
ptr = NULL; // 指针被覆盖,无法释放原始内存
(3)异常或错误导致提前退出
如果程序在分配内存后发生异常或提前退出,可能会导致内存未被释放。例如:
void func() {
int* ptr = malloc(sizeof(int));
if (ptr == NULL) {
return; // 提前退出,忘记释放内存
}
// 其他代码
}