内存区域
Posted 夕颜缪缪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存区域相关的知识,希望对你有一定的参考价值。
5个内存区域:
全局名称空间;自由存储区;寄存器;代码空间;堆栈
局部变量和函数参数位于堆栈中;代码位于代码空间中;全局变量位于全局名称空间中;寄存器用于内部管理工作,如记录栈顶指针和指令指针;余下的所有内存都被作为自由存储区,通常被称为堆。
可以讲自由存储区域视为一块很大的内存,其中有数以千计的依次被编号的内存单元,可用于存储数据。与堆栈不同,不能堆这些单元进行标记,而必须先申请内存单元的地址,然后将它存储到指针中。
自由存储区的优点是,从中分配的内存将一直可用,直到明确指出不再需要将其释放。如果在内存中分配自由存储区中的内存,在函数返回后该内存仍可用。这也是自由存储区的缺点,如果忘记释放内存,被占据而没有使用的内存将随着时间的推移越来越多,导致系统崩溃。
采用这种内存访问方式而不是全局变量的优点是,只有能够访问指针的函数才能访问它指向的数据。这样,只有将包含指针的对象或指针本身传递给函数,函数才能够修改指针指向的数据,从而减少了函数能够修改数据而又无法跟踪变更的情况发生。
在C++中,使用关键字new来分配自由存储区中的内存。在new后面跟上要为其分配内存的对象的类型,让编译器直到需要多少内存。new的返回值是一个内存地址。内存地址被存储在指针中,因此应将new的返回值赋给一个指针。例如要在自由存储区中创建一个unsigned short变量,可如此操作:
unsigned short int * pPointer;
pPointer=new unsigned short int;
也可在声明指针的同时对其进行初始化:unsigned short int * pPointer=new unsigned short int;
无论采用哪种方式,pPointer都将指向自由存储区中的一个unsigned short int。可以想使用其他指向变量的指针那样使用它,将一个值赋给它指向的内存区域:* pPointer=72;
该条语句的含义是:将72放在pPointer指向的区域中或将72赋给pPointer指向的自由存储区中的区域。
使用完内存区域后,必须将其归还系统。可以将delete应用于指针。delete将内存归还给自由存储区。切记,使用new分配的内存不会被自动释放。如果指针变量指向自由存储区中的内存块,离开该指针的作用域时,该内存块不会被自动归还给自由存储区。相反,该内存块已被视为已分配出去,同时由于该指针不再可用,将无法访问该内存块。当指针为局部变量时将发生这样的情况。当函数返回时,在该函数中声明的指针不再作用域中,从而丢失。使用new分配的内存不会被释放,而是变得不可用。这被称为内存泄露,因为在程序结束前该内存块再也无法使用。
delete pPointer;
最常见的情况是,在构造函数中从堆中分配内存,在析构函数中释放这些内存。
以上是关于内存区域的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理物理内存组织结构 ⑤ ( 内存区域 zone 类型简介 | 内存区域类型zone_type 枚举源码分析 | zone_type 枚举源码 )
Linux 内核 内存管理分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )
Linux 内核 内存管理分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )
Linux 内核 内存管理内存映射相关数据结构 ⑥ ( 文件映射 虚拟内存区域 | vm_area_struct | vm_operations_struct | 匿名映射 虚拟内存区域 )