C/C++ 内存管理总结
C内存管理
存储时:
执行程序在存储时(没有调入到内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。
1 代码区(text segment)
存放CPU执行的机器指令(machine instructions)。通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
2 数据区:
- 全局初始化数据区/静态数据区(initialized data segment/data segment)
data段:该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)。
BSS段(uninitialized data segment),存入的是全局、静态 未初始化的变量,程序没有存储实际的数据,只是存储了必要的信息,程序执行前,系统根据信息分配相应的新的内存,然后全部清0。供程序使用。所以,未初始的全局、静态变量在程序执行之前已经成0了。
常量存储区:常量数据(如字符串常量)
运行时:
(1)代码区(text segment)
代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。
代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。
(2)全局初始化数据区/静态数据区(Data Segment)
只初始化一次。
(3)未初始化数据区(BSS)
在运行时改变其值。
(4)栈区(stack)
由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。
(5)堆区(heap)
用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。
在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员malloc分配释放,使用free释放,若程序员不释放,程序结束时由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
在C++中,内存分成5个区
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制。使用free释放内存,如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由new分配的内存块,他和堆是十分相似的,不过它是用delete来结束自己的生命的。
自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
C++ 自由存储区是否等价于堆?:
http://www.codesec.net/view/223702.html
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
new/delete 与malloc/free的区别
- new不需要手动计算内存大小,malloc需要手动计算
- new包含了malloc和构造两步,new调用构造函数,delete调用析构函数
- new返回类型指针,malloc返回void指针
参考:http://blog.csdn.net/xiaxzhou/article/details/75040846
相关文章
- C++内联函数的使用
- 【C/C++学院】0729-语音识别/Const关键字/字符串应用/内存分配以及处理海量数据
- 【C/C++学院】0725-内存补码分析/补码原码实战/打印整数二进制数据/静态库说明
- 【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强
- 几款好的C/C++编译器(编译器而非IDE)
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- 解答私信@被c++折磨头秃的花季美少女 //C++ 利用指针数组输入10个单词,编写函数对10个单词进行排序并输出,要求判断是否有相同的单词,如果有相同的单词在输出时该单词只输出一次。
- 解答私信@被c++折磨头秃的花季美少女 //C++ 编写一个进阶版的进制转换程序,运行功能如下:请选择要输入的数字的进制(2、8、10、16):请输入该数字:请选择要转换成的进制(2、8。。。
- C++一种简单的配置文件读取(格式有限制)
- 【代码质量】C/C++代码静态分析与常用分析软件工具
- Ubuntu下在Eclipse IDE for C/C++ Developers中怎样执行C语言的GTK程序?(已解决)
- C++函数调用操作符重载()
- C++虚继承下的内存模型(二)
- C++ new和delete(C++动态分配和释放内存)
- Ubuntu20.04下,qt交叉编译报错::15: warning: identifier ‘nullptr‘ is a keyword in C++11 [-Wc++0x-compat]
- VC++中ANSI、UNICODE与UTF-8字符编码之间的转换(附源码)
- 使用Windbg排查C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题
- 引发C++程序内存错误的常见原因分析与总结
- C++使用技巧(二十八):回顾内存new关键字、引用、默认参数、 占位参数、重载、类和对象、构造函数
- 【C++】内存管理常见面试题