计算机内存中的堆和栈

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

相关推荐
傲世仙尊7 分钟前
C++起步-命名空间解决命名冲突与cin-cout缺省参数
开发语言·c++
(Charon)23 分钟前
【C++面试】四种cast转换:static_cast、dynamic_cast、const_cast与reinterpret_cast
开发语言·c++·面试
蒸蒸yyyyzwd1 小时前
后端学习笔记 day58
c++·八股
道尔柯南1 小时前
【QT】从零认识 Qt:跨平台 C++ GUI 开发入门
开发语言·c++·qt
MayZork2 小时前
std::filesystem 文件操作详解
开发语言·c++·qt
NeilYuen13 小时前
【C++】STL源码仿写(二):vector
开发语言·c++
郝学胜_神的一滴14 小时前
游戏引擎原理与实践 04:拆解引擎基础系统与内存管理
c++·游戏
All for pursuit.14 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791314 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂15 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛