内存溢出之后线程消亡会释放堆内存吗?

本文探讨了当线程内部发生内存溢出时,该线程将被中断并消亡的现象。通过设置最大堆大小为20M,并在一个线程中不断读取数据直至内存溢出,验证了这一结论。

通过之前的验证,已经知道,如果一个线程内部发生了内存溢出,会导致这个线程中断且消亡。
比如说:
在这里插入图片描述

设置最大堆为20M

然后开启两个线程,一个线程里面不断的读数据 直到内存溢出。

### 堆内存与栈的区别及应用场景 #### 1. **定义与分配机制** 堆和栈是两种主要的内存分配方式,分别具有不同的特点。 - 栈(Stack)是一种由编译器自动管理的内存区域,主要用于存储局部变量、函数调用帧以及返回地址等临时数据。它的分配和释放完全自动化,随着函数的进入和退出完成相应的操作[^1]。 - 堆(Heap)则是程序员手动管理的一片内存区域,通常用于动态分配较大的对象或数组。它需要通过 `new` 或 `malloc` 显式申请,通过 `delete` 或 `free` 进行释放。如果忘记释放已分配的内存,可能会引发内存泄漏问题[^1]。 --- #### 2. **性能差异** 由于两者的实现机制不同,它们在运行效率上的表现也有所区别: - 栈的操作非常高效,因为它是基于指针移动的方式进行内存分配和释放,时间复杂度接近 O(1)[^1]。然而,栈的空间有限,且一旦超出容量可能导致栈溢出错误。 - 堆虽然提供了更大的灵活性和更广的可用空间范围,但由于涉及复杂的内存管理和碎片化问题,其分配速度相对较慢。此外,频繁地申请和释放堆内存可能进一步加剧内存碎片化的风险[^2]。 --- #### 3. **生命周期** 两者所保存的数据在其作用域结束后的处理方式存在显著差别: - 存储于栈中的数据会在对应的作用域结束后立即被销毁;也就是说,当某个函数执行完毕之后,该函数内部所有的局部变量都将随之消失[^1]。 - 对于位于堆内的资源而言,除非开发者主动调用了删除指令或者程序整体终止之前都不会自行消亡。这意味着即使不再使用的对象也可能一直占用着宝贵的系统资源直到人为干预为止[^2]。 --- #### 4. **线程安全性** 从发编程角度来看,这两种类型的内存也有各自独特的性质: - 每个单独启动起来的新线程都会获得自己专属版本的小型私密工作区—也就是我们所说的“本地栈”。这样做的好处在于可以有效避免多个进程之间相互干扰的情况发生,从而天然具备良好的线程安全特性[^1]。 - 而公共可访问的大规模全局池子即所谓的“共享堆”,则允许任何正在运行中的各个独立单元都能够自由读写其中的内容。但是这也带来了潜在的竞争条件隐患,所以在多线程环境下使用时需格外小心采取适当同步措施来保障一致性[^1]。 --- #### 5. **典型的应用场景** ##### 栈适用场合: - 需要快速创建和销毁小型短期存在的实体; - 不关心跨模块持久性的简单计算逻辑; - 函数递归过程中产生的中间状态维护需求等等。 ```cpp void exampleFunction() { int localVariable; // 自动分配至栈上 } ``` ##### 堆适合情况: - 动态调整大小的数据集合比如链表节点追加移除动作频繁的情形下; - 大量长期驻留的对象实例构建如图形界面组件树形结构之类的复杂关联关系表示法之中; - 当确切知道所需尺寸前无法预先设定固定布局规划的时候采用堆更为合适一些。 ```cpp int* dynamicArray = new int[10]; // 手工请求一块连续整数序列存放在堆里头 // 记得适时清理掉以免泄露哦! delete[] dynamicArray; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值