黑马软件工程师--01.C语言关于内存管理的学习笔记

黑马程序员--01.C语言关于内存管理的学习笔记

------- android培训、java培训、iOS培训 期待与您交流! ----------

  既然写C语言的内存管理,那我得首先知道什么是内存管理。在百度百科中搜索:内存管理,我看到这样的解释:
内存管理,是指运行时对计算机内存资源的分配和使用的技术 。
  这个是百度百科对内存管理做出比较详细的介绍: 内存管理。

  我之前接触的是java语言,C语言的功底其实不怎么好,所以在刚接触C语言的时候一直搞不懂为什么New出来的东西,最后还要释放,不释放不可以吗?为什么java中没有释放,在C和C++中涉及到释放了呢?由于对内存管理的不清楚,导致我写C语言代码的时候经常会忽视掉释放,只知道new,代码在运行起来时间长出现崩溃问题,导致问题定位了很久,所以我觉得我很有必要梳理一下。

  直接进入正题,内存的分配方式有三种:

(1).在静态存储区域分配内存。这部分内存在程序编译的时候已经分配好了,并且在程序的整个运行过程中都存在。比如:全局变量,静态变量。

(2).在栈上被创建的内存。函数内部的局部变量,这部分内存在函数执行时被创建出来,在函数执行结束时被存储单元自动释放掉。如下是简单的代码示例:

1 int p (int y)
2 {
3  static int x = 1;    // 静态变量
4  int z = 3;           //局部变量
5  return x+y+z;
6 }

(3).从堆上分配的内存,也称之动态内存分配。用malloc或者new来申请内存,用free或delete来释放内存。代码示例如下:

 1 {
 2   A *a = new A;         //创建一个A对象
 3   if(NULL == a)        //检查指针是否为NULL
 4  {
 5    return ;
 6  }
 7    ........            //对a的操作
 8  delete a;            //使用完记得释放内存
 9  a = NULL;           //并置为NULL,防止为野指针。
10 }

  其实总结起来,常见的内存错误有以下几种,之前这些情况自己都没有注意,然后给你自己挖了一个又一个的坑!说多了全是泪啊!直接进入正题!
常见的内存错误如下:

  1.内存分配不成功。在申请完内存在之后要在使用内存之前检查指针是否为NULL,添加判空语句判断指针有效性。
  2.内存分配成功,但是对没有初始化的指针进行了操作。
  3.内存分配成功,并对其进行了初始化,但是在操作过程中越过了内存的边界。
  4.使用完内存之后没有及时的释放掉,造成内存泄露。
  5.使用已经释放过的内存。

  6.使用free或delete释放了内存后,没有将指针设置为NULL,导致产生“野指针”。

  所以在用malloc或new申请内存之后,应该立即检查指针值是否为NULL,防止使用指针值为NULL的内存。并对动态内存进行初始化,防止将未初始化的内存作为右值使用。动态内存的申请与释放必须配对,防止内存泄漏。用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
    使用内存之前检查指针是否为NULL。用malloc或new申请任意多少的内存,切记要自己负责在何时用free或delete释放内存。

既然C /C++中存在这么多的内存问题,到底在应用的时候如何检测呢?之前看到****论坛有一个帖子说的不错,所以贴出地址,学习学习。

http://bbs.****.net/topics/90493295,C/C++内存管理机制,希望对看到的人能有所帮助。

------- android培训、java培训、iOS培训期待与您交流! ----------