计算机内存中的堆和栈

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

栈(Stack)

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

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

比如你写一个函数:

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

函数执行完毕后,as 会被自动释放

堆(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 可以灵活地存储任意长度的字符串。

相关推荐
郝学胜_神的一滴3 分钟前
C++20模板元编程 04:变量模板 别名模板与模板Lambda实战
c++·visual studio
Methy14 分钟前
一次线上死锁排查:std::list::size () 居然是 O (n)?
c++·后端
2401_8685347815 分钟前
利弊比较类 社会生活类
c++·需求分析
wuminyu26 分钟前
纯轻量级锁体系下C2编译器锁粗化和消除机制剖析
java·linux·c语言·jvm·c++
weilx123442 分钟前
C++笔记-mutex
c++
beijixinghe1 小时前
第15节 指针作为函数参数的工程实战用法
开发语言·c++·c++基础·c++入门·几何引擎c++
j7~1 小时前
【C++微服务项目开发脚手架】(准备篇)从 0 到跑通:Docker 容器开发环境 + 宿主机用户 + Trae 远程连接 全链路踩坑实战
linux·c++·学习·xshell·docker容器·trae
唠玖馆1 小时前
C++11
c++
云泽8084 小时前
从零搭建 WSL2 + Ubuntu C/C++ 开发环境:原理、实践与底层架构解析
linux·c++·windows·ubuntu·wsl2
初願致夕霞10 小时前
C++11:类型推导与完美转发复盘笔记
c++