内存管理的理解

内存管理
未初始化的全局变量(.bss段)
bss 段:没有被初始化和初始化为0 的全局变量
bss类型的全局变量只占运行时的内存空间,而不占用文件空间
作为全局变量,在整个程序运行周期内,bss数据是一直存在的

初始化过的全局变量(.data段)
data 段用来存放那些初始化为非0 的全局变量
data类型的全局变量既占文件空间,也占运行时的内存空间
作为全局变量,在整个程序运行周期内,data数据是一直存在的

常量数据(rodata段)
rodata用来存放常量数据的
注:常量不一定在rodata中,有的存放在代码段(.text)中
对于字符串常量,编译器会自动去掉重复的,保证一个字符串在一个可执行文件中只存在一份复制
rodata是多个进程间可以共享的,提高运行空间的利用率
在有的嵌入式系统中,rodata放在ROM中,运行时直接读取,无需加载到RAM
常量是不能修改的,修改常量在Linux中会出现段错误
总结:在运行过程中 ,把不会改变的数据设为rodata类型,在多个进程间共享,大大提高空间的利用率,甚至不占用RAM空间,同时由于rodata在只读的内存页面是受保护的,这可以提高的程序的稳定性,字符串会被放在rodata中,其他数据加上const关键字修饰也能放在rodata中

代码(.text)段
text段存放代码和部分整数常量,这个段是可执行的,这点不同于rodata,其他类似

栈(stack)
存放临时变量和函数参数
栈向下(低地址)增长,每向栈中PUSH一个元素,栈顶就向低地址扩展,每从栈中POP一个元素,栈顶就向高地址回退
注:存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数被返回了,这些函数也就自动释放了,继续访问这些变量会造成意想不到的错误

堆(heap)
  • malloc:用来分配一块指定大小的内存
  • realloc:用来调整/重分配一块存在的内存
  • free:用来释放不再使用的内存
malloc 和 free要配对使用,内存分配了不释放称为内存泄漏,内存分多少用多少,读多了会读到随机数据,写多了会造成随机破坏,这种情况我们称为缓冲区溢出
属性为r-p表示存放的是rodata
属性为rw-p表示存放的是bss和data
属性为r-xp表示存放的是text数据

内存分配方式有三种
  1. 从静态存储区域分配,内存在编译时就分配好,整个程序执行期间都存在,如:全局变量,static变量
  2. 在栈上创建,函数内的局部变量,分配运算使用内置于处理器的指令集
  3. 在堆上分配,亦称为动态分配,如:malloc new申请,free和delete释放,生存期由程序员决定

总结:全局变量和static变量是整个程序需要用到的,单独分出一块存储区保存,在程序的整个运行期间该存储区储存的数据不清空;
局部变量是在函数退出时自动清空,放在栈(stack)里进行临时存储,用指令new和malloc分配的内存需要自己在堆(heap)中手动申请并使用free和delete指令手动释放。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值