内存管理的理解

3/8/2017来源:ASP.NET技巧人气:3123

内存管理 未初始化的全局变量(.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指令手动释放。