Day 9 C++ 内存分区模型

内存四区包括代码区、全局区、栈区和堆区,各自有不同的作用和生命周期。代码区存放只读的机器指令,全局区存储全局变量和常量。栈区用于函数调用时的参数和局部变量,而堆区则需要程序员手动管理内存分配与释放。new操作符用于在堆区动态分配内存,delete负责释放内存,避免内存泄漏和悬空指针问题。
摘要由CSDN通过智能技术生成

目录

内存四区

代码区

全局区

栈区

堆区

内存四区意义:

程序运行前后内存变化

程序运行前

代码区

全局区

 程序运行后

栈区

堆区

new操作符

基本语法

创建

释放(delete)


内存四区

代码区

代码区(Code Segment):存放程序的机器指令,包括函数体的二进制代码。这部分内存由操作系统进行管理,是只读的,不允许修改。

全局区

全局区(Global/Data Segment):存放全局变量、(static)静态变量以及(const)常量数据。全局变量和静态变量在程序运行期间始终存在,而常量数据则通常存储常量字符串等不可修改的数据。这部分内存在程序启动时分配,在程序结束时释放。

栈区

栈区(Stack):用于存储函数的参数值、局部变量以及函数调用时的上下文信息,由编译器自动分配和释放,具有后进先出(LIFO)的特点。在函数调用时,会为每个函数帧(函数调用的上下文)分配一段栈空间,函数返回后会自动释放该空间。

堆区

堆区(Heap):用于动态分配内存,程序员可以通过手动管理来申请和释放堆内存。堆区的内存分配和释放不受函数调用的限制,需要程序员显式地使用newdeletemallocfree等操作符来进行内存的分配和释放,若程序员不释放,程序结束时由操作系统回收。堆区的内存空间是不连续的,大小相对较大。

内存四区意义:

不同区域存放的数据,被赋予了不同的生命周期, 让我们可以更灵活地编程

(帮助我们合理管理内存资源,提高程序的性能和可维护性)

 

程序运行前后内存变化

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为全局区和代码区两个区域

代码区

存放 CPU 执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区

全局变量和静态变量存放在此.(全局变量、static 静态变量)

全局区还包含了常量区, 字符串常量和其他常量也存放在此. (const 常量等)

该区域的数据在程序结束后由操作系统释放

 程序运行后

多了堆区和栈区,栈和堆是在程序运行时动态创建的。在程序运行时,根据需要会动态地为局部变量、函数调用等分配栈空间,而堆则用于动态分配内存。

栈区

栈区是由编译器自动分配和释放的,用于存储函数的参数值、局部变量等数据。栈的分配和释放遵循后进先出的原则(LIFO)。当程序执行到一个函数时,该函数的参数会被压入栈中,并在函数执行完毕后自动释放。同样,函数内部的局部变量也会在函数执行完毕后被自动销毁。

注意:在栈区分配的数据不应返回其地址,因为一旦函数执行结束,栈上的数据将被清除,这意味着返回局部变量的地址可能会导致访问已经释放的内存,引发未定义的行为。为了避免这种情况,应始终返回指向堆上动态分配的内存的地址,或是返回全局变量的地址。

堆区

堆区是由程序员手动分配和释放的,需要注意的是如果程序员没有及时释放堆区的内存,那么在程序结束时,操作系统会回收这些内存。

一般使用new关键字来在堆区动态地分配内存,通过new分配的内存将在堆区中创建,并返回该内存的地址。我们可以使用指针来保存这个地址,并在适当的时候使用delete关键字释放对应的内存。需要注意的是,在使用堆区的内存时,要确保正确分配和释放内存,否则可能会导致内存泄漏或者因释放已释放内存而产生悬空指针。

new操作符

new 是C++中用于动态分配内存的操作符。它可以用来在堆区(也称为自由存储区)上创建对象或数组。(程序员手动开辟,手动或者程序结束时自动释放,释放内存利用操作符 delete

基本语法

new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

创建

//动态创建单个对象:

Type* pointer = new Type;

//Type* pointer = new Type(a);



//动态创建数组:

Type* array = new Type[size]{a,b,c};

//Type* array = new Type[size];

释放(delete)

//释放对象

delete pointer;

//释放数组

delete[] array;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值