堆空间
在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
堆空间的申请\释放
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后就无法访问堆空间存放的值