10-内存空间布局

写在前面

每个应用都有自己独立的内存空间--今天不会讲太多代码,主要是理论。
复制代码

名词解释

每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域
栈空间,堆空间,代码区,全局区,其实我们主要关心的是堆区,因为我们的代码的声明周期都在堆区里完成。
复制代码
名 称说明作用
堆空间每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间自动分配和回收
堆空间需要主动去申请和释放比如类的对象的创建
代码区代码段(代码区)用于存放代码
全局区数据段(全局区)用于存放全局变量等

码上建功 --堆空间

在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
堆空间的申请\释放
malloc \ free 
new \ delete
new [] \ delete []

是不是有点速度快,Java和OC中局可以使用new来初始化一个对象。
来看几个栗子
// 没有初始化
int *p1 = new int;
// 初始化为0
int *p2 = new int();
// 初始化为5
int *p3 = new int(5);
// 没有初始化
int *p4 = new int[3];
// 全部元素初始化为0
int *p5 = new int[3]();
// 全部元素初始化为0
int *p6 = new int[3]{};
// 首元素初始化为5,其他元素初始化为0
int *p7 = new int[3]{ 5 };

这样做有什么问题没,C++ 可没有ARC和GC管理机制
new 这么多的对象,肯定造成内存泄露了。
每new一次就要在不使用的时候销毁(delete),要成对出现
int *p = new int;
delete p;

复制代码

码说 --栈空间 全局区

定义一个结构体
struct Person {
    int m_age;
};
// 全局区
Person g_person;
// 栈空间
Person person;
int main() {
    // 栈空间
    Person person;
    // 堆空间
    Person *p = new Person();
    p->m_age = 20;
    delete p;
    //举一个malloc的栗子
    Person *p2 = (Person *) malloc(sizeof(Person));
    free(p2);
}

复制代码

装逼一下

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

完整代码demo,请移步GitHub:DDGLearningCpp

当然C++大神就绕吧,非喜勿喷,毕竟这是个人的学习笔记?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值