在程序运行时内存会被划分成多个区域其中栈区和堆区是管理对象 / 变量最核心的两个区域shared_ptr管理的对象通常就在堆区。一、一句话总结区别栈区自动分配、自动释放、速度快、空间小、线程独立。堆区手动分配 / 智能指针管理、手动 / 自动释放、速度慢、空间大、全局共享。二、详细对比表对比维度栈区Stack堆区Heap管理方式编译器自动分配、自动释放手动 new/malloc 分配智能指针 /delete/free 释放空间大小小默认 1M~8M系统固定很大几乎受限于虚拟内存分配速度极快仅移动栈指针慢需要查找空闲内存块内存连续性连续内存不连续链式分配生命周期随函数 / 代码块结束自动销毁手动控制直到释放 / 程序结束碎片问题无频繁分配易产生内存碎片线程关系每个线程独有栈所有线程共享堆存储内容局部变量、函数参数、返回地址new/malloc 创建的对象、大数据异常安全性安全不会泄漏容易泄漏必须手动释放三、核心区别详细解释1. 管理方式不同最关键栈区函数开始 → 自动开辟内存函数结束 → 自动销毁内存程序员完全不用管释放堆区需要手动new/malloc申请必须delete/free释放现代 C 用shared_ptr / unique_ptr自动管理堆内存避免泄漏2. 空间大小不同栈很小一般只有几 MB递归太深会爆栈堆很大可以分配 GB 级别的内存受限于系统3. 分配速度不同栈只需要移动指针1 个指令完成堆需要遍历空闲链表、找合适块、分配、标记效率低4. 生命周期不同栈变量离开作用域立刻销毁堆对象生命周期由程序员 / 智能指针控制5. 线程安全不同栈每个线程独立栈不存在线程安全问题堆所有线程共享必须加锁保护四、代码示例void func() { // 栈区 int a 10; // 栈变量 char str[] hello; // 栈数组 // 函数结束自动释放无需delete // 堆区 int* p new int(20); // 堆对象 // 必须手动释放否则内存泄漏 delete p; // C 推荐智能指针管理堆自动释放 shared_ptrint sp make_sharedint(30); }五、为什么 shared_ptr 管理的是堆对象因为栈对象会自动释放不需要智能指针管理生命周期栈对象不能 delete否则崩溃shared_ptr 的设计目标就是管理堆内存make_shared、new创建的都在堆区六、最终总结可直接放文章结尾栈区自动管理速度快、空间小存临时变量。堆区手动 / 智能指针管理速度慢、空间大存长期对象。shared_ptr 只用于管理堆区对象不能管理栈区对象。日常开发小对象用栈大对象 / 动态生命周期用堆 智能指针。
堆区(Heap)与栈区(Stack)的核心区别
在程序运行时内存会被划分成多个区域其中栈区和堆区是管理对象 / 变量最核心的两个区域shared_ptr管理的对象通常就在堆区。一、一句话总结区别栈区自动分配、自动释放、速度快、空间小、线程独立。堆区手动分配 / 智能指针管理、手动 / 自动释放、速度慢、空间大、全局共享。二、详细对比表对比维度栈区Stack堆区Heap管理方式编译器自动分配、自动释放手动 new/malloc 分配智能指针 /delete/free 释放空间大小小默认 1M~8M系统固定很大几乎受限于虚拟内存分配速度极快仅移动栈指针慢需要查找空闲内存块内存连续性连续内存不连续链式分配生命周期随函数 / 代码块结束自动销毁手动控制直到释放 / 程序结束碎片问题无频繁分配易产生内存碎片线程关系每个线程独有栈所有线程共享堆存储内容局部变量、函数参数、返回地址new/malloc 创建的对象、大数据异常安全性安全不会泄漏容易泄漏必须手动释放三、核心区别详细解释1. 管理方式不同最关键栈区函数开始 → 自动开辟内存函数结束 → 自动销毁内存程序员完全不用管释放堆区需要手动new/malloc申请必须delete/free释放现代 C 用shared_ptr / unique_ptr自动管理堆内存避免泄漏2. 空间大小不同栈很小一般只有几 MB递归太深会爆栈堆很大可以分配 GB 级别的内存受限于系统3. 分配速度不同栈只需要移动指针1 个指令完成堆需要遍历空闲链表、找合适块、分配、标记效率低4. 生命周期不同栈变量离开作用域立刻销毁堆对象生命周期由程序员 / 智能指针控制5. 线程安全不同栈每个线程独立栈不存在线程安全问题堆所有线程共享必须加锁保护四、代码示例void func() { // 栈区 int a 10; // 栈变量 char str[] hello; // 栈数组 // 函数结束自动释放无需delete // 堆区 int* p new int(20); // 堆对象 // 必须手动释放否则内存泄漏 delete p; // C 推荐智能指针管理堆自动释放 shared_ptrint sp make_sharedint(30); }五、为什么 shared_ptr 管理的是堆对象因为栈对象会自动释放不需要智能指针管理生命周期栈对象不能 delete否则崩溃shared_ptr 的设计目标就是管理堆内存make_shared、new创建的都在堆区六、最终总结可直接放文章结尾栈区自动管理速度快、空间小存临时变量。堆区手动 / 智能指针管理速度慢、空间大存长期对象。shared_ptr 只用于管理堆区对象不能管理栈区对象。日常开发小对象用栈大对象 / 动态生命周期用堆 智能指针。