C++内存管理面经

 更新时间:2023年03月28日 10:55:11   作者:attacking tiger  
这篇文章主要介绍了C++的内存分配方式以及介绍了下栈和堆的区别,感兴趣的小伙伴可以参考阅读本文

1. 简述下C++的内存分配方式。

  • 在C++中,内存可以分为 5 个区,分别为栈,堆,自由存储区,全局/静态变量,常量存储区
  • (1):在执行函数时,函数内局部变量的存储单元在栈上创建,函数执行完时这些存储单元被自动释放。
  • (2):通过 malloc 分配的内存块,通常和 free 搭配,需要手动释放。
  • (3)自由存储区:通过 new 分配的内存块,通常和 delete 搭配,也需要手动释放。
  • (4)全局/静态存储区:用于存储全局变量和静态变量。
  • (5)常量存储区:用于存放常量,不允许修改。

 2. 简述下栈和堆的区别。

  • (1)空间分配不同:栈存放函数内的局部变量,由操作系统自动释放;堆通过 malloc 分配,需要手动释放。
  • (2)缓存方式不同:栈使用的是一级缓存,被调用时处于存储空间;堆使用的是二级缓存,速度要慢些。
  • (3)数据结构不同:栈类似栈结构,先进后出;堆类似数组结构,先进先出。

3. malloc 和局部变量分配在堆还是栈?

  • malloc 分配在堆中,他会分配一块指定大小的内存空间,并返回一个指针,使用完毕后需要手动回收。
  • 局部变量分配在在栈中,超过作用域后系统自动回收。

 4. 程序有哪些部分?分别的作用是什么?

  • (1)数据段:存放程序中已初始化的全局变量和静态变量。
  • (2)代码段:存放程序执行代码的一块区域,头部包含一些常数变量。
  • (3)BSS段:存放程序中未初始化的全局变量和静态变量的一块区域。
  • (4)可执行程序在运行时会多出两个区域:
  • :动态申请内存用。从低向高增长。
  • :存储局部变量,函数参数值。从高向低增长。
  • (5)在堆和栈之间有个文件映射区。

5. 程序的执行过程是怎么样的?

  • (1)操作系统创建相应的进程并分配进程空间,加载器把可执行文件中的代码段,数据段映射到进程中的虚拟空间。
  • (2)加载器读入可执行程序中的导入符号表,根据符号表可以查询需依赖的动态依赖库。
  • (3)加载器将程序中的动态依赖库进行导入。
  • (4)初始化应用程序中的全局变量,对于全局变量自动调用构造函数。
  • (5)进入程序入口函数开始执行。

6. 初始化为 0 的全局变量在 bss 还是 data 区?

  • 数据区:存放初始化不为 0 的全局变量和静态变量。
  • BSS区:存放初始化为 0 或未初始化的全局变量和静态变量。

7. 什么是内存泄漏?如何解决?

内存泄漏:

  • 申请了一块儿内存空间,但是使用完毕后没有释放。
  • (1)new 和 malloc 申请后,没有使用 delete 和 free 释放。
  • (2)子类继承父类时,父类析构函数不是虚函数。
  • (3)windows 句柄资源使用后没有释放。

对策:

  • (1)养成良好的编程习惯,分配的内配使用后,记的释放。
  • (2)将分配内存的指针以链表的形式存储,使用完毕后从链表中删除进行管理。
  • (3)使用智能指针。

8. 常见的内存错误有哪些?

常见内存错误:

  • (1)内存分配未成功却使用。
  • (2)内存分配成功,但是未初始化就引用。
  • (3)内存分配成功并初始化,但是操作超出了内存的边界。
  • (4)忘记了释放内存,造成内存泄漏。
  • (5)释放了内存却继续使用。

对策:

  • (1)用 malloc 或 new 申请内存后,应该检查返回的指针是否为 NULL。
  • (2)为指针初始化为 NULL,为数组和动态内存赋初值。
  • (3)避免数组越界。
  • (4)动态内存的申请和释放必须配对。
  • (5)用 free 和 delete 释放内存之后,指针应该置空防止野指针。
  • (6)使用智能指针。

9. 什么是内存对齐?

  • 为了能够使 CPU 进行快速的访问,变量的起始地址应该具有某些特征,即对齐。比如 4 字节的 int,起始地址应该在 4 字节的边界上。
  • 假如变量的地址不是自然对齐,那么 CPU 要访问该值的话需要访问两次或三次内存,而对齐的话只需要一次,访问的速度更快。
  • 内存对齐一般应用在 struct,class,union 数据类型中。

 到此这篇关于C++内存管理面经的文章就介绍到这了,更多相关C++内存管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中Cbitmap,HBitmap,Bitmap区别及联系

    C++中Cbitmap,HBitmap,Bitmap区别及联系

    这篇文章主要介绍了C++中Cbitmap,HBitmap,Bitmap区别及联系的相关资料,需要的朋友可以参考下
    2015-06-06
  • 关于C++中push_back()函数的用法及代码实例

    关于C++中push_back()函数的用法及代码实例

    push_back是vector的一个方法,表示将一个元素存储到容器的末尾,下面这篇文章主要给大家介绍了关于C++中push_back()函数用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Linux下C语言实现贪吃蛇小游戏

    Linux下C语言实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了Linux下C语言实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 用C语言来实现一个简单的虚拟机

    用C语言来实现一个简单的虚拟机

    这篇文章主要介绍了用C语言来实现一个简单的虚拟机,其中栈数组的部分非常值得学习,需要的朋友可以参考下
    2015-07-07
  • C++多线程实现TCP服务器端同时和多个客户端通信

    C++多线程实现TCP服务器端同时和多个客户端通信

    通讯建立后首先由服务器端发送消息,客户端接收消息;接着客户端发送消息,服务器端接收消息,实现交互发送消息。本文主要介绍了C++多线程实现TCP服务器端同时和多个客户端通信,感兴趣的可以了解一下
    2021-05-05
  • C++实现简易的五子棋小游戏

    C++实现简易的五子棋小游戏

    这篇文章主要为大家详细介绍了C++实现简易的五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 一文解密C++中的多态机制

    一文解密C++中的多态机制

    众所周知C++语言的三大特性:封装、多态、继承,其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,下面小编就来带大家深入了解一下C++的多态机制吧
    2023-07-07
  • 详解C++中的自动存储

    详解C++中的自动存储

    这篇文章主要介绍了详解C++中的自动存储,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-09-09
  • 合并排序(C语言实现)

    合并排序(C语言实现)

    递归算法是把一个问题分解成和自身相似的子问题,然后再调用自身把相应的子问题解决掉。这些算法用到了分治思想。
    2013-02-02
  • C语言顺序表的实现代码

    C语言顺序表的实现代码

    这篇文章主要为大家详细介绍了C语言实现顺序表的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论