美文网首页
10-内存空间布局

10-内存空间布局

作者: _东阁堂主_ | 来源:发表于2019-02-11 10:46 被阅读1次

写在前面

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

名词解释

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

码上建功 --堆空间

在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
堆空间的申请\释放
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++大神就绕吧,非喜勿喷,毕竟这是个人的学习笔记📒

相关文章

网友评论

      本文标题:10-内存空间布局

      本文链接:https://www.haomeiwen.com/subject/mkidsqtx.html