当前位置: 首页 > article >正文

C/C++ 内存分布与管理:简单易懂的入门指南

1,内存分布概述

1,1内存的组成

在c/c++中,程序的内存分布大致可以分布大致可以分为以下几个部分:

  • 代码区:存放程序的可执行代码。
  • 数据区: 
  1. 全局/静态变量(数据段)区:存放全局变量和静态变量。
  2. 常量区(代码段):存放常量数据。
  • 堆区:用于动态分配内存。
  • 栈区:用于存放局部变量和函数参数。

1,2内存分配方式

主要有两种:

  1. 静态内存分配:在编译时分配内存,生命周期从程序开始到结束🔚。
  2. 动态内存分布:在运行时分配内存,可以手动控制,生命周期由程序员管理。

2,内存管理

2,1静态内存分配

在静态内存分配中变量的大小和数量在编译时就已确定。这类内存分配的优点是简单、效率高,但缺点是灵活性差

#include <iostream>
using namespace std;

int main() {
    int arr[5]; // 静态分配一个大小为5的数组

    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1; // 赋值
    }

    // 打印数组内容
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " "; // 输出:1 2 3 4 5
    }
    return 0;
}

 2,2动态内存分配

在动态内存分配中,内存是在程序运行时分配的,使用 new delete 关键字。动态分配的优点是灵活,可以根据需要调整内存的大小。⚠️点我主页后续会出

#include <iostream>
using namespace std;

int main() {
    int *arr = new int[5]; // 动态分配一个大小为5的数组

    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1; // 赋值
    }

    // 打印数组内容
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " "; // 输出:1 2 3 4 5
    }

    delete[] arr; // 释放动态分配的内存
    return 0;
}

 2,3 内存泄漏与管理⚠️

内存泄漏是指程序中动态分配的内存没有被正确释放,导致内存无法被重用。

#include <iostream>
using namespace std;

void leakMemory() {
    int *leak = new int[10]; // 动态分配内存
    // 忘记释放内存
}

int main() {
    for (int i = 0; i < 1000; i++) {
        leakMemory(); // 每次调用都会造成内存泄漏
    }
    return 0;
}

如何避免内存泄漏

  • 始终使用 deletedelete[] 释放动态分配的内存
  • 使用智能指针(如 std::unique_ptrstd::shared_ptr)来自动管理内存

 3,实例分析

3,1 静态内存分配示例

#include <iostream>
using namespace std;

int main() {
    int a = 10; // 静态分配
    int b[5]; // 静态分配一个数组

    cout << "a: " << a << endl; // 输出:10
    cout << "b size: " << sizeof(b) / sizeof(b[0]) << endl; // 输出:5
    return 0;
}

3.2 动态内存分配示例

#include <iostream>
using namespace std;

int main() {
    int *ptr = new int; // 动态分配一个整数
    *ptr = 20; // 赋值
    cout << "ptr: " << *ptr << endl; // 输出:20

    delete ptr; // 释放内存
    return 0;
}

4,最后复盘

  1. C/C++ 内存管理主要分为静态和动态两种方式。
  2. 静态内存分配简单但灵活性差,动态内存分配灵活但需谨慎管理。
  3. 避免内存泄漏的最佳方法是始终释放不再需要的动态内存。

5,共勉💪

 信念和目标,必须永远洋溢在程序员内心。

加油各位it人,有这理想就不怕。

我很喜欢雷军的一段话:我们就悄悄的干,就算失败了咱也不丢人。


http://www.kler.cn/a/354251.html

相关文章:

  • 网关的国际化改造
  • 安装fast_bev环境
  • 天地图接口Python代码详解
  • MFC/C++学习系列之简单记录13
  • jvm栈帧中的动态链接
  • 信创技术栈发展现状与展望:机遇与挑战并存
  • hive 误删表恢复
  • 前端一键复制解决方案分享
  • Qt中的连接类型
  • 利用PHP爬虫API接口:高效获取数据的艺术
  • ICM20948 DMP代码详解(85)
  • hardhat部署智能合约
  • 面试感受(续)
  • 简单谈谈mysql中的日志 bin log
  • C语言数据结构—队列
  • Springboot中基于 IP 地址的请求速率限制拦截器
  • Java 创建图形用户界面(GUI)组件详解之JFrame、JTextField、JTextArea、JPasswordField、JScrollPane、JLabel
  • docker安装kafka并使用SASL 进行身份验证
  • 无人机组装、维护、飞行技术全能培训详解
  • WebGl 使用缓冲区对象绘制多个点
  • 建造者模式(C++)
  • MySQL日期类型选择建议
  • FPGA学习-将modelsim中的波形数据保存到TXT文件方便MATLAB画图分析
  • 023 elasticsearch查询数据 高亮 分页 中文分词器 field的数据类型
  • 【布隆过滤器】
  • 在生产制造领域,可视化大屏的作用可以说无可替代。