c++ 内存模型

C++ 内存空间

在 C++ 中,程序运行时使用的内存主要分为几个不同的区域,其中最重要的是栈(Stack)和堆(Heap)。
在这里插入图片描述

内存空间的主要区域

  1. 代码区(Text Segment)

    • 存储程序的机器指令(编译后的代码)
    • 通常是只读的
  2. 全局/静态区(Data Segment)

    • 存储全局变量和静态变量
    • 分为:
      • 已初始化数据区(.data
      • 未初始化数据区(.bss
  3. 栈(Stack)

    • 自动管理的内存区域
    • 存储局部变量、函数参数、返回地址等
  4. 堆(Heap)

    • 动态分配的内存区域
    • 需要手动管理(或通过智能指针管理)

栈(Stack) vs 堆(Heap) 详细对比

特性栈(Stack)堆(Heap)
分配方式自动分配/释放手动分配/释放 (new/delete)
管理方式编译器自动管理程序员手动管理
分配速度非常快(只需移动栈指针)相对较慢(需要查找合适内存块)
内存大小较小(通常几MB)较大(受系统可用内存限制)
生命周期函数执行期间直到显式释放
碎片问题可能有(频繁分配释放后)
访问速度更快(CPU缓存友好)稍慢
扩展方向通常向下增长通常向上增长
典型用途局部变量、函数调用动态大小或生命周期长的对象

代码示例

#include <iostream>

// 全局变量 - 存储在全局/静态区
int global_var = 10;

void stackExample() {
    // 局部变量 - 存储在栈上
    int stack_var = 20;
    std::cout << "Stack variable: " << stack_var << std::endl;
    // 函数结束时自动释放
}

void heapExample() {
    // 动态分配 - 存储在堆上
    int* heap_var = new int(30);
    std::cout << "Heap variable: " << *heap_var << std::endl;
    // 必须手动释放,否则内存泄漏
    delete heap_var;
}

int main() {
    stackExample();
    heapExample();
    
    // 静态局部变量 - 存储在全局/静态区
    static int static_var = 40;
    std::cout << "Static variable: " << static_var << std::endl;
    
    return 0;
}

使用建议

  1. 优先使用栈内存

    • 对于生命周期与函数相同的小型对象
    • 访问更快,自动管理更安全
  2. 需要使用堆内存的情况

    • 对象需要比创建它的函数更长的生命周期
    • 对象太大(可能超过栈大小限制)
    • 需要动态大小的数据结构(如运行时才知道大小的数组)
  3. 现代C++最佳实践

    • 尽量使用智能指针(std::unique_ptr, std::shared_ptr)而不是裸指针管理堆内存
    • 对于容器类,优先使用标准库容器(std::vector, std::string等),它们内部会合理管理内存
  4. 避免常见错误

    • 栈溢出(递归太深或分配大数组)
    • 内存泄漏(忘记释放堆内存)
    • 悬垂指针(访问已释放的内存)
    • 双重释放(多次释放同一内存)

动态分配内存

  /*
    * 动态分配内存
    */
    //1. 声明一个指针,用new 运算符向系统申请一块内存,让指针指向这块内存
    int* p = new int(5);
    std::cout<<"p: "<<p<<" *p: "<<*p<<std::endl;
    //2. 通过指针解引用方法,像使用变量一样使用这块内存
    *p = 8;
    std::cout<<"p: "<<p<<" *p: "<<*p<<std::endl;
    //3. 如果这块内存不用了,用delete释放这块内存
    delete p;
    return 0;
    // 注意:如果动态分配的内存不用了,必须delete释放,否则可能用尽系统的内存。
//结果

p: 0x12aa0f70 *p: 5
p: 0x12aa0f70 *p: 8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值