目录
前言:
1、程序的基本运行流程
2,为啥要分为四个区域?
3,分为哪四个区域?
4,4个区域详解
代码区:
为什么会设置这两个功能呢?
全局区:
栈区:
堆区:
new:
补充知识:new关键字
总结:
前言:
这篇博客介绍c++四大分区的详解,其中也会涉及到有关new关键字的知识点
对于程序员来说,认识内存的分区是一项基本功能。
1、程序的基本运行流程
首先我们写代码时,代码会存放在硬盘上,然后会被操作系统存放在内存里分好的四个区中,然后开始执行代码。
注意:代码从硬盘放到内存中也是由操作系统来工作的
2,为啥要分为四个区域?
由于不同区域放的数据会被赐予不同的生命周期,使操作更灵活,不会导致混淆,也使管理更灵活。
反正总结来说,就是更方便了。
3,分为哪四个区域?
分为代码区、全局区、栈区、堆区。
静态区,代码区,堆区,栈区 存储地址依次下降
而他们在程序运行前和程序运行后又有不同的分类
对于程序运行前,c++内存分为代码区和全局区,而在程序运行后划分的区域就又有栈区和堆区了。
4,4个区域详解
代码区:程序运行前放的区域,编译后生成exe可执行程序,未执行程序前分为两个区域:代码区和全局区
代码区:
存放2进制的机器指令,CPU执行的机器指令,功能为共享+只读
为什么会设置这两个功能呢?
因为有些程序会重复执行,所以设置共享的功能,不会造成资源浪费。
而只读是为了防止程序意外修改指令
全局区:
存放全局变量和静态变量和常量——const修饰变量和字符串常量,该区域的数据在程序结束后由操作系统释放。
全局变量是指在主程序外面写的变量,局部变量和全局变量都不在一个段里存放
静态变量就是在普通变量前加上static,属于静态变量,
常量-》字符串常量和const修饰的变量,这里const修饰的变量是const修饰的全局变量不包含const修饰的局部变量。
const修饰的全局变量-》可以叫全局常量
const修饰的局部变量-》不放在全局区里
常量的地址都很接近,基本上地址的前几个数字都一样
而同在全局区的全局变量和静态变量,虽然前面地址不一样但是同样挨得很近。
栈区:
由编译器自动分配释放,存放函数的参数值和局部变量等,栈区数据在函数执行完后会自动释放。 从大(地址)到小(地址)存贮
注意事项: 不要返回局部变量的地址why ?——因为局部变量存在栈区,栈区数据在函数执行完后自动释放,因此地址无法拿到,不要返回局部变量地址。但是如果写一个程序,发现可以打印啊,为什么?因为编译器会给你做个保留,第二次再次输出时,发现这个数据就不是正常的了,因此最好不要去返回局部地址,
堆区:
需要自己创建,自己释放,假如程序员不自己释放掉,程序结束时由操作系统回收,注意:在程序运行时,程序不会自己释放这片数据的。
堆:从小(地址)到大(地址);
那么如何把数据开辟到堆区呢?
使用关键字new
new:
可以使用new关键字来让数据开辟到堆区:
new 数据类型(具体的赋值)
例如:new int(1),这样就开辟了一块堆区数据,而返回一个数据类型指针。
那么如何表示这个堆区变量呢?
由指针接受
int*a=new int(1),这样就是创造了一个指针变量a指向内存中堆区开辟的整型数据“1”
编号返回,用指针接收这块内存。
但是这时候会问,那指针不是不在堆区吗,为什么要用一个指针来开辟呢?
因为指针是一个局部变量,放在栈区,如果拿一个整型常量,无法存储堆区的数据。
只要在内存上,都有地址编号,拿一个指针开辟是为了存储堆区的数据
如何释放堆区数据?
利用delete关键字来释放空间
补充知识:new关键字
适用语法:new 数据类型(初始化数据)这个括号可以不写,相当于不初始化数据
new返回的是该数据类型的指针
在堆区创建,而我们也知道堆区数据由程序员开辟,由程序员释放
释放后就会非法操作,再次访问会出错。
那么创建数组呢?
int *a=new int[10],这里的10代表数组有10个元素,后续和正常数组变量一样操作就可以,不过最后需要释放这个delete[] a;
注意这里要加[]告诉程序要释放所有的数组元素。
总结:
内存分为代码区,全局区,堆区,栈区,
而在程序运行之前内存分为代码区和全局区,
在程序运行之后才有栈区和堆区
而堆区的数据需要程序员自己释放自己创建,使用关键字new和delete文章来源:https://www.toymoban.com/news/detail-828105.html
感谢观看,欢迎点赞收藏专栏,会分享更多c++的知识,如有错误,欢迎大佬指正(●'◡'●)文章来源地址https://www.toymoban.com/news/detail-828105.html
到了这里,关于c++内存的四大分区详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!