• 【C++】动态内存管理 ① ( C 语言中的动态内存管理 | C 语言 内存申请 | C 语言 内存释放 | 代码示例 )






    一、动态内存管理



    动态内存管理由

    • 内存的申请
    • 内存的释放

    构成 , 这里的内存指的是 堆内存 , 与之相对的是 栈内存 ;


    在 程序运行时 过程中 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源 , 包括 :

    • 分配 堆内存 中的 内存空间
    • 释放 堆内存 中的 内存空间

    C 语言 和 C++ 语言 中 , 都有 动态 分配 / 释放 堆内存 的方法 ;

    • C 语言中 , 主要是 堆内存的 分配 与 释放 ;
    • C++ 语言中 , 主要是 对象的动态建立和释放 ;




    二、C 语言中的动态内存管理




    1、C 语言 内存申请


    在 C 语言中 , 使用malloc()、calloc()、realloc() 等标准库函数来动态地申请内存 :

    • malloc(size_t size) : 分配指定字节大小的堆内存 , 返回一个指向堆内存空间的指针 , 失败则返回 NULL ;
    • calloc(size_t num, size_t size): 分配指定 块数 和 字节大小的 堆内存 , 与 malloc 对比 calloc 自动将内存初始化为 0 ;
    • realloc(void* ptr, size_t size) : 修改已分配内存块的字节大小 ; 如果 指针参数 ptr 为 NULL , 则该函数与 malloc 函数功能相同 ; 如果 参数 size 为 0 , 则该函数 与 free 函数功能相同 , 用于释放 ptr 内存 ;

    调用上述函数前 , 需要导入 stdlib.h 头文件 ;

    #include   
    
    • 1

    2、C 语言 内存释放


    在 C 语言中 , 调用 free() 标准库函数 释放已申请的内存 ;


    3、代码示例 - C 语言动态内存管理


    在下面的代码中 ,

    首先 , 使用 malloc() 函数 动态地申请了 可以存放 5 个 int 数据的 堆内存 ,

    // 函数原型 : 
    void *malloc(unsigned int size)
    • 1
    • 2

    然后 , 将 malloc 函数返回的 void * 类型的指针转为 int * 类型的指针 ;

    // 函数原型 : 
    // void *malloc(unsigned int size);
    // 申请内存
    int* array = (int*)malloc(5 * sizeof(int));
    
    • 1
    • 2
    • 3
    • 4

    再后 , 使用数组下标的方式访问内存 , 为内存赋值 ;

        // 为内存赋值
        // 赋值时使用数组下标的方式访问内存
        for (int i = 0; i < 5; i++) {
            array[i] = i;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    再后 , 打印内存数据 , 获取内存空间值时使用指针形式访问内存 ;

        // 打印内存
        // 获取内存空间值时使用指针形式访问内存
        for (int i = 0; i < 5; i++) {
            printf("%d ", *(array + i));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    最后 , 调用 free 函数释放这块内存 ;

        // 释放内存  
        free(array);
    
    • 1
    • 2

    代码示例 :

    #include   
    #include   
    
    int main() {
        // 申请内存
        int* array = (int*)malloc(5 * sizeof(int));
        if (array == NULL) {
            printf("内存分配失败\n");
            return -1;
        }
    
        // 为内存赋值
        // 赋值时使用数组下标的方式访问内存
        for (int i = 0; i < 5; i++) {
            array[i] = i;
        }
    
        // 打印内存
        // 获取内存空间值时使用指针形式访问内存
        for (int i = 0; i < 5; i++) {
            printf("%d ", *(array + i));
        }
        printf("\n");
    
        // 释放内存  
        free(array);
    
        // 控制台暂停 , 按任意键继续向后执行
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    执行结果 :

    0 1 2 3 4
    请按任意键继续. . .
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    Mysql索引+事务+存储引擎
    python测试工程师 之 python基础大全【13万字总结】
    java ffmpeg获取视频时长
    ATFX汇市:10月美国名义CPI年率大降,美元指数创近三月新低
    java进阶学习路线
    实验十七:模拟霍尔传感器实验
    PPO-KL散度近端策略优化玩cartpole游戏
    【音视频|ALSA】SS528开发板编译Linux内核ALSA驱动、移植alsa-lib、采集与播放usb耳机声音
    分布式微服务定时任务方案
    python基础教程:异常处理
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133045645