首页 > 试题广场 >

请你说一说C++的内存管理是怎样的?

[问答题]

请你说一说C++的内存管理是怎样的?

用内存四区来理解不行吗? 分为栈,堆,常量区,全局区。而全局区又分为bss和data 段。最后为文件映射区和代码区。

发表于 2020-03-20 09:58:28 回复(0)
  • 栈区:主要用来存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行时,系统会自行释放栈区的内存,而不需要用户参与管理

  • 堆区:由用户手动申请,手动释放。如:malloc/free开辟内存的空间,从低地址向高地址增长。

  • 自由存储区:就是由new/delete开辟内存空间。

    • 通常认为C++中有两个动态内存区域。通过new/delete方式进行内存资源的分配和释放的称为自由存储区(free store),而通过malloc/free方式进行内存资源的分配和释放的称为堆区(heap)。

    • 本质上来说很多编译器中的new操作符是通过malloc进行内存申请的,因此可以将堆区理解为自由存储区的一个具体实现,虽然二者不完全相同,但很多时候可以混为一谈。

  • 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

    注意:

    在C语言中,初始化的全局变量和静态变量放在一块内存区域中,而未初始化的全局变量和静态变量放在与之相邻的另一块内存区域中。而在C++中则没有在静态区中将初始化的和未初始化的变量进行分开存储,因为C++会对未初始化的全局变量和静态变量进行默认初始化(一般默认初始化为0)。该区域存储的数据会在程序结束后由系统来释放。

  • 常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

发表于 2020-07-22 15:05:31 回复(0)
&

1、堆区 动态分配的内存,new malloc

2、栈区 局部变量 函数参数 函数返回类型

3、数据区 初始化的全局变量以及初始化的静态变量

4、bss区 未初始化的全局变量和静态变量

5、常量区 全局constant变量

6、代码区 存放代码

发表于 2020-04-05 23:40:59 回复(0)
r
发表于 2019-09-01 13:52:12 回复(0)
在C++中,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。 代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 数据段:存储程序中已初始化的全局变量和静态变量 bss 段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。 堆区:调用new/malloc函数时在堆区动态分配内存,同时需要调用delete/free来手动释放申请的内存。 映射区:存储动态链接库以及调用mmap函数进行的文件映射 栈:使用栈空间存储函数的返回地址、参数、局部变量、返回值
发表于 2020-09-04 09:51:35 回复(0)

The memory that a program uses is typically divided into a few different areas, called segments:

  • The code segment (also called a text segment), where the compiled program sits in memory. The code segment is typically read-only.
  • The bss segment (also called the uninitialized data segment), where zero-initialized global and static variables are stored.
  • The data segment (also called the initialized data segment), where initialized global and static variables are stored.
  • The heap, where dynamically allocated variables are allocated from.
  • The call stack, where function parameters, local variables, and other function-related information are stored.
发表于 2020-06-28 23:16:29 回复(0)
返回值放栈里?不是放通用寄存器里吗,32位eax,64位rax,不够用就用edx或rdx!
另外除了题中说的几个虚拟内存区域,还应该有 虚拟地址空间的起始部分、代码段之前的一部分,保留区;虚拟地址空间 最后一部分 为内核区;除此,还有由于对齐和栈随机化产生的区域间隙
编辑于 2020-05-17 15:36:39 回复(2)

代码区,数据区,BBS区,堆,栈,文件映射区

发表于 2019-12-28 11:02:59 回复(1)