计算机内存中的堆和栈

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

相关推荐
老当益壮梁奶奶5 小时前
Linux软件编程学习笔记(七):线程分离与线程间通信详解
linux·c语言·c++·笔记·学习
水饺编程9 小时前
第5章,[Win32 章节] :绘图模式
c语言·c++·windows·visual studio
INGNIGHT10 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
小小杨树10 小时前
【C++】学习:双缓冲视频流水线深解析
c++·性能优化·音视频开发
青少儿编程课堂12 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
赵民勇12 小时前
C++无锁编程详解
c++
醉颜凉12 小时前
C++ 中野指针与悬挂指针的区别:从成因到防范,彻底讲清两种危险指针
c++
Demon--hx12 小时前
设计不能被继承的类
开发语言·c++
兔兔兔兔112 小时前
记录C++ 13
开发语言·c++·算法
开心大爆炸13 小时前
ubuntu20.4 安装ros1 noetic版本流程
c++