c++内存四区之——栈区与堆区

上篇讲了代码区和全局区,本节关于栈区与堆区

一.首先是栈区

栈区存放局部变量(包括const修饰的局部变量),形参等

栈区的数据由编译器自动分配释放,存放函数的参数值,局部变量等。

另外要注意,函数不能返回局部变量的地址,因为栈区开辟的数据由编译器自动释放。例如:

输出结果为:

 注释:这里f函数里的p为局部变量,其被储存在栈区中。该处返回了局部变量p的地址,在main函数中用整型指针a接收并对a进行解引用和打印。打印第一行能出现正确的数字是因为编译器进行了一次保留,但在此后自动释放了p开辟的地址,导致第二次打印输出为错误的数据。

二.堆区

堆区比较自主化,由程序员来进行操作,有以下两点:

1.堆区是由程序员分配和释放空间的。如果程序员不进行释放也不会一直保存,操作系统会进行回收。

2.堆区的空间用new来开辟,用delete来进行释放。(如果不释放可能会出现内存泄漏问题,运行会崩溃)

结果为:

下面顺便一提new和delete的用法

new用来分配堆区空间,有两种:

1.申请单个空间 

new+数据类型;

或:

new+数据类型(初值);

2.申请连续空间

new[ 内存单元个数 ];

注意:new返回的是对应的地址,所以要用同类型的指针接收。

当new申请一个多维数组变量或者数组对象时,会返回一个指向数组第一个元素的地址。

delete用来释放new创造的堆区空间

delete a;//a为接收new返回的地址的指针

delete [内存单元个数] b;//b为接收new开辟的数组的指针

注意:new开辟用的语法和delete释放用的语法应对应,如下文:

new <--> delete
new [] <--> delete []

更多的关于delete与new的用法详解可见

https://blog.csdn.net/qq_58619891/article/details/127658251?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170495149416800227431756%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170495149416800227431756&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-127658251-null-null.142^v99^pc_search_result_base7&utm_term=%E5%A0%86%E5%8C%BA&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值