C++面向对象的内存布局 二(堆空间)

堆空间

在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存

堆空间的申请\释放

malloc \ free
在这里插入图片描述
new \ delete
在这里插入图片描述
new [] \ delete []
在这里插入图片描述

注意
申请堆空间成功后,会返回那一段内存空间的地址
申请和释放必须是1对1的关系,不能回收一部分,不然可能会存在内存泄露
现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在
利:提高开发效率,避免内存使用不当或泄露
弊:不利于开发人员了解本质,永远停留在API调用和表层语法,对性能优化无从下手

在这里插入图片描述
若函数调用完,若没有释放堆空间,就没有指针指向这个堆空间了

堆空间的初始化

在这里插入图片描述
在这里插入图片描述

memset

◼ memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法
在这里插入图片描述

总结

对象的内存可以存在于3种地方

全局区(数据段):全局变量

栈空间:函数里面的局部变量

堆空间:动态申请内存(malloc、new等)

在这里插入图片描述

误区

delete 指针 释放堆空间时,并没有把堆空间里的存放的数值清零。只是回收堆空间内存:这块堆空间内存可以重新被别人使用

int *p = new int;
cout <<p << endl;
*p = 10;
delete p; // 回收堆空间(4个字节),此时原来开辟的堆空间里存放的还是10,没有删除,因为没有必要
cout << p << endl;
int *p11 = new int;//后面重新开辟的堆空间如果要存数据,直接覆盖原来的,因为堆空间的开辟就是用来存数据的
cout << p11 << endl;//如果没有存数据,那可能获取的值就是原来开辟时存放的值(也就是10)

在这里插入图片描述
但是释放p后就无法访问堆空间存放的值
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值