内存管理
2016-01-20 10:54
281 查看
1、C程序运行时的内存结构
2、变量生存期
3、内存空间的动态分配
静态数据区:全局变量,static修饰的局部变量 代码区 : 程序指令,大部分字面常量 栈区 :函数形参,局部变量(大部分) 堆区 :动态分配的内存 寄存器组 :函数形参,局部变量(小部分)
2、变量生存期
定义:一个变量占有内存空间的时间段 C++将变量的生存期分为3种:静态、自动、动态 静态生存期:全局变量都具有静态生存期,其内存空间从程序开始执行进行分配,程序结束收回 自动生存期:局部变量和函数形参具有自动生存期,其内存空间从程序执行到函数体时分配,函数结束时收回 动态生存期:此类变量生存时间由程序员控制,其内存空间用malloc函数分配,用free 函数收回
3、内存空间的动态分配
动态分配内存空间步骤: a.定义一个指针变量 b.申请一块内存空间,并将其首地址赋给指针变量,此时即可通过指针变量访问这块内存空间 c.用完后释放这块内存空间 示例: void *p = nullptr; p = malloc(50); ..... free(p); 注: 刚分配的动态内存的初始值不确定,须对其进行初始化; 不能对同一指针(地址)连续free两次; 不能对指向全局变量(静态内存区)和局部变量(栈内存区)的指针进行 free,但可对空指针进行 free (可连续 free); 对一个指针应用free之后,其值不会发生改变,但其指向一个无效内存区; 若未及时释放动态内存,并且将指向该内存块的指针指向了别处,就会造成“内存泄露”; 在进行内存空间申请时,须避免发生以下错误: a.内存分配未成功,却使用了它 b.内存分配成功,但尚未初始化就进行引用(误以为初始值为0) c.内存分配成功且已初始化,但操作越过内存边界 d.未释放内存,导致内存泄露 e.释放了内存空间却继续使用 悬空指针:不为NULL且没有指向有效内存地址的指针变量(即将内存空间 free 后未将指针置为NULL) 注:通过悬空指针访问其所指向的内存区域将发生不可预知的错误
相关文章推荐
- Specification_&_Datasheet_&_Books
- ko的 dependentObservable 引用自身声明方式
- MapReduce算法设计-Second Sorting
- C++中内存分配详解
- Android 首次创建数据库或者更新时,SQLiteOpenHelper的使用与解析
- AndroidStudio操作笔记--简单介绍1
- 中国行政区县GPS坐标
- DirectShow SDK下载
- greenDAO讲义(二):数据库查询篇
- 线程池系列一:线程池作用及Executors方法讲解
- 2.求最长无重复字符子串和求最长回文子串的算法
- MySQL数据库的优化
- 2014年面试题
- PKI常见证书格式和转换
- plsqldev工具自动提交
- 自学Python十 爬虫实战三(美女福利续)
- iOS之 opencv3.0.framework
- Eclipse启动Tomcat后无法访问项目
- 2014年面试题
- 我写给自己的你们不要看