C++ 内存泄露

1,282 阅读2分钟

(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),并从那里开始释放,然后再遍历回父节点,如下面的代码所示: image.png
free(p->np);
free(p);
  • 返回值的不正确处理
    • 在内存分配后忘记使用 free 进行释放
char *f(){
	return (char *)malloc(10);
}
void f1(){
	f();
}

避免内存泄露

  • 确保没有在访问空指针。
  • 每个内存分配函数都应该有一个 free 函数与之对应,alloca 函数除外。
  • 每次分配内存之后都应该及时进行初始化,可以结合 memset 函数进行初始化,calloc 函数除外。
  • 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
  • 在对指针赋值前,一定要确保没有内存位置会变为孤立的。
  • 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点。