C++:2.内存

1.2.1 简述一下堆和栈的区别

1. 堆栈空间分配不同。栈由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等;堆一般 由程序员分配释放。

2. 堆栈缓存方式不同。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立 即释放;堆则是存放在二级缓存中,速度要慢些。

3. 堆栈数据结构不同。堆类似数组结构;栈类似栈结构,先进后出

1.2.2 简述C++的内存管理

1. 内存分配方式:

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

  • 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元 自动被释放。
  • 堆,就是那些由new分配的内存块,一般一个new就要对应一个delete。
  • 自由存储区,就是那些由malloc等分配的内存块,和堆是十分相似的,不过是用free来结束自己的 生命。
  • 全局/静态存储区,全局变量和静态变量被分配到同一块内存中
  • 常量存储区,这是一块比较特殊的存储区,里面存放的是常量,不允许修改。

2. 常见的内存错误及其对策:

  • (1)内存分配未成功,却使用了它。
  • (2)内存分配虽然成功,但是尚未初始化就引用它。
  • (3)内存分配成功并且已经初始化,但操作越过了内存的边界。
  • (4)忘记了释放内存,造成内存泄露。
  • (5)释放了内存却继续使用它。

对策:

  • (1)定义指针时,先初始化为NULL。
  • (2)用malloc或new申请内存之后,应该立即检查指针值是否为NULL。
  • (3)不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
  • (4)避免数字或指针的下标越界,特别要当心发生“多1”或者“少1”操作
  • (5)动态内存的申请与释放必须配对,防止内存泄漏
  • (6)用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针”
  • (7)使用智能指针。

3. 内存泄露及解决办法:

什么是内存泄露?

简单地说就是申请了一块内存空间,使用完毕后没有释放掉。

  • (1)new和malloc申请资源使用 后,没有用delete和free释放;
  • (2)子类继承父类时,父类析构函数不是虚函数。
  • (3) Windows句柄资源使用后没有释放。

怎么检测?

  • 第一:良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得使用其相应的函数释放 掉。
  • 第二:将分配的内存的指针以链表的形式自行管理,使用完毕之后从链表中删除,程序结束时可检 查改链表。
  • 第三:使用智能指针。
  • 第四:一些常见的工具插件,如ccmalloc、Dmalloc、Leaky、Valgrind等等。

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

malloc是在堆上分配内存,需要程序员自己回收内存;局部变量是在栈中分配内存,超过作用域就 自动回收。

1.2.4 程序有哪些section,分别的作用?

如上图,从低地址到高地址,一个程序由代码段、数据段、BSS段、堆、共享区、栈等组成。

  • 1. 数据段:存放程序中已初始化的全局变量和静态变量的一块内存区域。
  • 2. 代码段:存放程序执行代码的一块内存区域。只读,代码段的头部还会包含一些只读的常数变量。
  • 3. BSS 段:存放程序中未初始化的全局变量和静态变量的一块内存区域。
  • 4. 可执行程序在运行时又会多出两个区域:堆区和栈区。 堆区:动态申请内存用。堆从低地址向高地址增长。 栈区:存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。
  • 5. 最后还有一个共享区,位于堆和栈之间。

1.2.5 初始化为0的全局变量在bss还是data

BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特 点是可读写的,在程序执行之前BSS段会自动清0。

1.2.6 简述C++中内存对齐的使用场景

内存对齐应用于三种数据类型中:struct/class/union

struct/class/union内存对齐原则有四个:

  • 1. 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地 方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始。
  • 2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成 员"的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的 整数倍开始存储)。
  • 3. 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的"最宽基本类型成员"的 整数倍。不足的要补齐。(基本类型不包括struct/class/uinon)。
  • 4. sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真 正存储于该地址。
  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值