内存管理

来源:互联网 发布:一键部署java环境 编辑:程序博客网 时间:2024/06/07 15:39

6.1数据存放

bss段(未初始化的全局变量):4MB 存放没有初始化的  /  初始化为0 的全局变量

data段(初始化过的全局变量):    存初始化过的数据

radata段(常量数据):

text段(代码):放代码和部分常量

stack段(栈):放临时变量和函数参数

heap(堆):malloc :分配一块指定大小的内存

                      realloc :调整  / 重分配一块内存

                      free      :释放不再使用的内存

6.2内存分配方式

1)从静态存储区分配:编译时就分配好了

2)在栈上分配   :内部局部变量,函数执行结束自动释放

3)在堆上分配  (动态内存分配):程序运行时用malloc / new 分配内存,手动用free / delete 释放

6.3野指针

成因:1)指针变量未初始化

           2)指针被free、delete后未置NULL

6.4常见内存错位及对策    

              错误预防             内存分配未成功assert分配成功,但未初始化就引用他别忘赋初值操作越过内存边界 忘记释放内存,泄漏内存 释放内存,却使用了它



(p!=NULL)/  if (p!=NULL)







6.5 段错误及调试方法

1)用gdb逐步查找段错误         gcc    -g -rdynamic    xxx.c ;gdb ./a.out

2)分析core文件                    gdb  ./a.out  core

3)段错误时启动调试            

4)利用backtrace和objdump 分析    objdump -d  a.out

6.6指针与数组对比

数组:在 静态存储区/栈 被创建,数组名对应着一块内存。地址和容量在生命周期内不变,内容可变

指针:可随时指向任意类型的内存块,指针操作动态内存。比数组灵活,但也危险

0 0