黑马软件工程师--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培训期待与您交流! ----------