计算机内存中的堆和栈

计算机内存的堆(Heap)和栈(Stack)

栈(Stack)

栈是系统自动管理 的一块内存区域,特点是后进先出(LIFO)。

  • 存放内容:局部变量、函数参数、返回地址等
  • 分配方式:编译器自动分配和释放
  • 大小:通常较小(一般几 MB)
  • 速度:非常快,因为只是移动栈顶指针

比如你写一个函数:

cpp 复制代码
void foo() {
    int a = 10;      // a 分配在栈上
    char s[20];      // s 也分配在栈上
}

函数执行完毕后,a 和 s 会被自动释放。

堆(Heap)

堆是程序员手动管理的一块内存区域,大小不固定。

  • 存放内容:动态分配的内存
  • 分配方式 :程序员用 new/malloc 申请,用 delete/free 释放
  • 大小:较大(可达 GB 级别)
  • 速度:比栈慢,因为需要查找空闲内存块

比如:

cpp 复制代码
int *p = new int(10);   // 在堆上分配一个 int
delete p;                // 手动释放

如果忘了 delete,就会造成内存泄漏。

对比总结

特性 栈(Stack) 堆(Heap)
管理方式 编译器自动管理 程序员手动管理
分配速度 很快 较慢
大小 较小(几 MB) 较大(可达 GB)
存放内容 局部变量、函数参数 动态分配的数据
释放时机 函数结束自动释放 必须手动释放
碎片问题 无 频繁分配释放会产生碎片
cpp 复制代码
string s;        // s 对象本身在栈上
cin >> s;        // s 内部的数据可能分配在堆上

string 这个变量本身在栈上,但它内部存储的字符串数据通常是在堆上动态分配的,这也是为什么 string 可以灵活地存储任意长度的字符串。

相关推荐
dtq04243 小时前
C++小案例 - 日志实战
开发语言·c++
码匠许师傅3 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅4 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
WBluuue7 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
必须得开心呀8 小时前
字节序大小端科普
c++·程序人生
会编程的小孩9 小时前
C++ 子集
c++
SunkingYang9 小时前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
前进吧-程序员9 小时前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20
前进吧-程序员10 小时前
实战:C++20 协程 + io_uring 写一个 400 行的 echo server
网络·c++·c++20
青少儿编程课堂14 小时前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛