(8条消息) C/C++什么是内存泄露,内存泄露如何避免?_kuanyew的博客-CSDN博客
内存溢出
- 内存溢出 OOM (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。
内存泄漏
- 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。最终的结果就是导致OOM。
造成内存泄露常见的三种情况
- 指针重新赋值
- 错误的内存释放
- 返回值的不正确处理
- 指针重新赋值
char * p = (char *)malloc(10);
char * np = (char *)malloc(10);
p=np;
int *p = new int;
p = new int...;//错误
- 错误的内存释放
- 每当释放结构化的元素,而该元素又包含指向动态分配的内存位置的指针时,应首先遍历子内存位置(如本示例中的 np),并从那里开始释放,然后再遍历回父节点,如下面的代码所示:
- 每当释放结构化的元素,而该元素又包含指向动态分配的内存位置的指针时,应首先遍历子内存位置(如本示例中的 np),并从那里开始释放,然后再遍历回父节点,如下面的代码所示:
free(p->np);
free(p);
- 返回值的不正确处理
- 在内存分配后忘记使用 free 进行释放
char *f(){
return (char *)malloc(10);
}
void f1(){
f();
}
避免内存泄露
- 确保没有在访问空指针。
- 每个内存分配函数都应该有一个 free 函数与之对应,alloca 函数除外。
- 每次分配内存之后都应该及时进行初始化,可以结合 memset 函数进行初始化,calloc 函数除外。
- 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
- 在对指针赋值前,一定要确保没有内存位置会变为孤立的。
- 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点。