内存的几种异常情况

855 词

内存溢出(Out of Memory)

概念

内存溢出指程序在申请内存时操作系统无法再向程序提供足够的内存空间,导致程序无法正常执行。结果是程序线程等待触发操作系统未响应,或者线程直接崩溃。


内存越界/内存踩踏

概念

内存越界是指程序在对指针或者数组等连续内存进行写操作时,没有考虑区域的大小而直接进行写操作,这样就导致其他区域的内存被写入数据,从而导致数据异常甚至程序崩溃

常见内存越界场景

1. 数组越界

1
2
int a[10];
a[10]=1;

即定义了一个长度为10的数组,但是访问了数组第11个元素,导致数组越界,访问了不属于该数组的内存空间,从而发生内存越界。

2. 指针越界

1
2
3
int *p;
p=(int *)malloc(10);
*p=1;

即定义了一个指针,但是没有给它分配内存空间,直接给指针赋值,导致指针越界,访问了不属于该指针的内存空间,从而发生内存越界。
`


内存泄漏(Memory Leak)

概念

申请的内存,首地址找不到了,再也没法使用了,也没法释放了,这种就被称为内存泄漏。

常见内存泄漏场景

1. 指针赋值导致地址丢失

动态内存申请函数返回的指针被重新赋值,或者被其他数据覆盖而导致丢失了原来指向的内存空间地址。

2. 定义函数申请空间后未释放

1
2
3
4
5
6
7
8
9
10
11
12
13
void fun(){
char *p;
p=(char *)malloc(100);
//接下来,可以用p指向的内存了
}

int main(){
//由于fun没有释放内存,导致每次调用都泄漏100字节
fun();
fun();
return 0;
}

即定义了函数中使用了动态内存申请函数,并且将返回的指针存在了栈区,但是在函数结束前并没有释放内存,这样就导致栈区的指针丢失,无法释放了。

3. 经常申请但是很少释放(隐性泄漏)

即申请内存的频率很高,但是很多情况下这些内存无法得到释放,被长时间占用,并且一直申请新的内存空间,这样的程序在长时间运行之后也会内存溢出从而崩溃。

内存泄漏的危害

长时间泄漏内存会导致程序内存溢出