内存泄漏

 堆上的内存由程序员申请和释放,再也不使用的内存没有释放掉,致使内存泄漏。内存泄漏的常见场景:程序员

1 指向堆的指针从新赋值函数

  char *p1 = (char*)malloc(5);spa

  char *p2 = (char*)malloc(5);3d

  p1 = p2; //指针p1被指向p2指向的内存地址,可是p1以前指向的内存尚未被释放掉,那块内存就变成了孤立内存,没法释放了,由于如今没有指针指向该内存位置,致使内存泄漏。指针

  

 

PS: 在对指针赋值前,必定要确保指针当前指向的内存位置不会变成孤立的blog

2 错误的内存释放内存

  假设指针p指向10字节内存,其中包含一个指针np,np指向另外的内存地址。get

  此时若是 free(p); 释放指针p指向的内存,那np指向的内存位置就变成了孤立的,也无法释放了,内存泄漏。内存泄漏

  

PS:正确的释放内存的方法是,先释放np指向的内存位置,再释放p指向的内存位置:遍历

  free(p->np);

  free(p);

   即:每当释放结构化的元素,该元素又包含指向动态分配的内存位置的指针时,应该先遍历子内存位置并释放,再遍历父节点

3 申请的内存没有使用free进行释放

PS:alloca函数申请的内存是栈上,由系统自动回收,alloca函数申请的内存不须要free释放

4 返回值是指针时 

  char *getPointer()
  {
    char *p = (char*)malloc(100);
    return p;
  }

  int main()
  {
    getPointer(); //getPointer函数里分配了100字节内存,这儿调用getPointer函数可是并无用指针接收返回值,致使没有指针指向该100字节内存,形成内存泄漏。     system("pause");     return 0;  }