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

2023-09-19 22:19:05





一、动态内存管理



动态内存管理由

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

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


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

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

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 <stdlib.h>  

2、C 语言 内存释放


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


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


在下面的代码中 ,

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

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

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

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

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

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

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

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

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

    // 释放内存  
    free(array);

代码示例 :

#include <stdio.h>  
#include <stdlib.h>  

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;
}

执行结果 :

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

在这里插入图片描述

更多推荐

Flutter动态化开发之Fair实战

一、背景目前移动端应用的版本更新,最常见的方式是定期发版,无论是安卓还是iOS,都需要提交新的安装包到应用市场进行审核。审核通过后,用户在应用市场进行App的下载更新。而动态化,就是不依赖更新程序安装包,就能动态实时更新页面的技术。相比动态化技术,定期发版更新应用的方式存在一些问题,比如:审核周期长,且可能审核不通过。

【完全二叉树魔法:顺序结构实现堆的奇象】

本章重点二叉树的顺序结构堆的概念及结构堆的实现堆的调整算法堆的创建堆排序TOP-K问题1.二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是

PostgreSQL缓存管理

缓冲区管理器、存储和后端进程之间的关系缓存管理结构PostgreSQL缓冲区管理器由buffertable、bufferdescriptors和bufferpool组成。bufferpool层存储表和索引等数据文件页,以及空闲空间映射和可见性映射。bufferpool是一个数组,每个槽存储数据文件的一个页面。缓冲池数组

No suitable driver found for jdbc:mysql://localhost:3306/BookManagement

目录问题背景解决办法问题背景今天遇见一个这个报错,解决后将解决方案分享一下:报错内容如下:“"C:\ProgramFiles\Java\jdk1.8.0_221\bin\java.exe""-javaagent:D:\IDEA2020_1\IntelliJIDEA2020.1\lib\idea_rt.jar=51910

React 全栈体系(六)

第三章:React应用(基于React脚手架)二、组件的组合使用-TodoList3.添加todo3.1App/*src/App.jsx*///创建“外壳”组件AppimportReact,{Component}from'react'importHeaderfrom'./components/Header'import

服务器数据恢复-ESX SERVER常见故障的数据恢复的可能性分析

ESXSERVER常见故障表现:1、因光纤存储设备连接至非ESX环境,共享未互斥,对存储进行的改写操作(如:重装系统,WINDOWS初始化,格式化等)导致存储结构损坏。2、卷升级、变更时分区表或VMFS卷结构异常。3、VMFS存储中VMDK被删除。4、VMFS被格式化。ESXSERVER故障解决方案:1、检测是否存在硬

[X3m]Ubuntu 根文件系统制作

使用ubuntu20.04sudoapt-getinstallwgetca-certificatesdevice-tree-compilerpvbclzopzipbinfmt-support\build-essentialccachedebootstrapntpdategawkgcc-arm-linux-gnueabi

【Django】 rest_framework接口开发流程及接口组成

rest_framework接口开发流程及接口组成使用restframework框架开发接口,方式应该有6、7种,每个人的习惯不同,用的方法也不一样,再次不再一一详述。我比较常用:ModelSerializer+GenericAPIView原因是用视图函数+装饰器、视图类+继承APIView、或者混入Mixin这三种封

React 窗口防抖

假如有这种需求:浏览器的窗口不断缩小变大,此时页面的布局不会自动刷新,需要手动刷新页面才会自适应大小。此时我们立马就会想到使用windows的onresize方法window.onresize=()=>{//重新渲染画面root.render(<App/>)}但是新的问题就会出现这个onresize方法会被调用多次,多

AI实战营第二期 第十节 《MMagic 代码课》——笔记11

AI实战营第二期第十节《MMagic代码课》MMagic(MultimodalAdvanced,Generative,andIntelligentCreation)是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和生成图像与视频的开源AIGC工具箱。MMagic允许研究人员和工程师使用最先进的预训练模型,并且可

从四个角度全面认识 ChatGPT

传统语言模型是什么样的?ChatGPT涌现出了哪些新能力?这些能力都是怎么做到的?在ChatGPT大模型时代,我们应该怎么做?当下最引人注目的语言模型ChatGPT如火如荼,主要还是因为其能力远远超越了传统模型。本文将对ChatGPT与传统模型进行对比,深入探讨ChatGPT具备的强大能力以及其背后的技术来源。此外还将

热文推荐