首页 > 试题广场 >

简述 C++ 的内存管理

段页式内存管理,通过段号找到页号,通过页号找到物理起始地址,再通过页偏移找到物理地址
发表于 2022-07-05 21:06:08 回复(3)
C++内存区分为内核空间内存和用户空间内存。以4G内存为例,高地址的1G内存是内核空间,0-3G内存地址是用户空间;用户空间从低到高分为:1、代码区(.text): 加载的是可执行文件代码段,在运行期间无法更改;2、已初始化数据区(.data): 加载可执行文件数据段,包括全局初始化数据区,静态数据区,存储于数据段的数据生存周期为整个程序运行期间;3、未初始化数据区(.bss): 加载可执行文件BSS段,位置可以分开也可以紧凑,存储于此段数据(全局未初始化变量,静态未初始化数据)生存周期和.data段相同;4、堆区(heap): 堆是一个容器,容量较大,用于动态内存分配,位于BSS段后面,一般由程序员分配和释放,若没有主动释放,程序结束时会由操作系统回收,若没有适合处理,容易造成内存泄露;5、文件映射段:包括动态库,共享内存等,从低地址向上增长;6、栈区(stack): 栈区内存由编译器自动分配和释放,存放函数参数值、返回值、局部变量等数据,在运行过程中实时加载和释放,栈区内存从3G地址开始由高向下增长,位于内存映射段上面,因此栈底内存地址大于栈顶地址。
发表于 2022-09-18 14:25:31 回复(0)
堆区、栈区、全局/静态存储区、常量存储区、代码区、自由存储区 堆区:程序员通过new/malloc 手动开辟的内存存放在堆区 栈区:函数的局部变量存放在栈区,函数调用结束后,自动释放内存 全局/静态存储区:存放全局变量或静态变量 常量存储区:存放常量 代码区:类中的函数存放在代码区(包含静态函数)
发表于 2023-08-15 10:59:47 回复(0)
栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数运行结束后这些存储单元会自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆:就是那些由new分配的内存块,他们的释放编译器不管,由我们的应用程序去控制,一般一个new就对应一个delete。如果程序员没有释放掉,那么在程序结束后操作系统会自动回收。 全局/静态存储区:内存在程序编译时就已经分配好,这块内存在程序整个运行期间都存在,主要用来存放静态数据(局部static、全局static变量)、全局变量、常量。 常量存储区:这是一块比较特殊的存储区,里面存放的是常量字符串,不允许修改。 代码区:存放的是程序的二进制代码。
发表于 2022-08-19 10:01:25 回复(0)
用户空间从低到高分为: 1、代码区(.text): 加载的是可执行文件代码段,在运行期间无法更改; 2、已初始化数据区(.data): 加载可执行文件数据段,包括全局初始化数据区,静态数据区,存储于数据段的数据生存周期为整个程序运行期间; 3、未初始化数据区(.bss): 加载可执行文件BSS段,位置可以分开也可以紧凑,存储于此段数据(全局未初始化变量,静态未初始化数据)生存周期和.data段相同; 4、堆区(heap): 堆是一个容器,容量较大,用于动态内存分配,位于BSS段后面,一般由程序员分配和释放,若没有主动释放,程序结束时会由操作系统回收,若没有适合处理,容易造成内存泄露; 5、文件映射段:包括动态库,共享内存等,从低地址向上增长; 6、栈区(stack): 栈区内存由编译器自动分配和释放,存放函数参数值、返回值、局部变量等数据,在运行过程中实时加载和释放,栈区内存从3G地址开始由高向下增长,位于内存映射段上面,因此栈底内存地址大于栈顶地址。
发表于 2023-07-26 16:42:11 回复(0)
代码区、未初始化数据区(BSS)、已初始化数据区(DATA)、栈区(Stack)、堆区(Heap) 可执行文件代码段。 BSS -> 全局未初始化,静态未初始化数据 ,生存周期为整个程序运行过程。 DATA -> 全局初始化,静态初始化数据,文字常量(只读) ,生存周期为整个程序运行过程 栈区 编译器自动分配释放,存放函数的参数值、返回值、局部变量等,在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。 堆区 动态内存分配,一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
发表于 2022-10-05 09:58:45 回复(0)
C++ 的内存分区主要有:代码区、未初始化数据区(BSS)、已初始化数据区(DATA)、栈区(Stack)、堆区(Heap)、rodata(只读数据段) 代码区:text段,存放指令和数据,程序代码,运行前就已经确定(编译时确定),通常为只读 BSS:存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。不需要存储,存储是为了记录初始值, bss段内容会被全部设为0。 Stack:存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。 Heap:程序运行过程中被动态分配的内存段,由用户申请和释放。 rodata段存储常量数据,rodata段是多个进程共享的,目的是为了提高空间利用率 data:存储已经初始化的全局变量,属于静态内存分配。(注意:初始化为0的全局变量还是被保存在BSS段)
发表于 2024-05-17 10:32:03 回复(0)
栈 文件映射区 堆 未初始化的全局变量和静态变量 已初始化的静态变量和全局变量 常量区 代码区 保留区域
编辑于 2024-04-14 16:33:22 回复(0)
首先要了解c++的内存模型,从低地址到高地址分别是保留区域、代码段、只读数据段(一些字面量)、已初始化的静态变量和全局变量、未初始化的静态变量、全局变量、堆、共享库函数、栈(从高地址到低地址增长)、内核共享区域。c++内存管理主要是程序员对堆的操作,栈用于函数调用、局部变量等,堆是程序员对大数据的管理,需要申请并及时释放,否则会造成内存泄漏
编辑于 2024-03-28 11:09:30 回复(0)
C++内存管理牵涉到三个概念:堆区、栈区、静态存储区 =》堆区:有程序员分配和释放,可能会造成内存泄漏,关键字:new、delete =》栈区:编译器自己管理:局部变量和函数信息。 =》静态存储区:存放静态变量、全局变量、常量 -- (初始化区和未初始化区域)
发表于 2023-11-09 21:31:07 回复(0)
这不是c的吗
发表于 2022-10-10 23:01:00 回复(0)
1
发表于 2022-07-01 15:37:37 回复(0)