首页 > 学院 > 开发设计 > 正文

内存管理的理解

2019-11-06 06:11:06
字体:
来源:转载
供稿:网友
内存管理未初始化的全局变量(.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数据内存分配方式有三种从静态存储区域分配,内存在编译时就分配好,整个程序执行期间都存在,如:全局变量,static变量在栈上创建,函数内的局部变量,分配运算使用内置于处理器的指令集在堆上分配,亦称为动态分配,如:malloc new申请,free和delete释放,生存期由程序员决定总结:全局变量和static变量是整个程序需要用到的,单独分出一块存储区保存,在程序的整个运行期间该存储区储存的数据不清空;局部变量是在函数退出时自动清空,放在栈(stack)里进行临时存储,用指令new和malloc分配的内存需要自己在堆(heap)中手动申请并使用free和delete指令手动释放。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表