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

FFmpeg源码:av_malloc_array、av_realloc_array函数分析

=================================================================

FFmpeg内存管理相关的源码分析:

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

FFmpeg源码:av_realloc、av_reallocp、size_mult、av_realloc_f函数分析
FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介

FFmpeg源码:buffer_create、av_buffer_create、av_buffer_default_free、av_buffer_alloc、av_buffer_allocz函数分析

FFmpeg源码:av_buffer_ref、av_buffer_unref函数分析

FFmpeg源码:av_buffer_is_writable、av_buffer_realloc函数分析

FFmpeg源码:av_malloc_array、av_realloc_array函数分析

=================================================================

一、av_malloc_array函数

(一)av_malloc_array函数的定义

av_malloc_array函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavutil/mem.c中:

void *av_malloc_array(size_t nmemb, size_t size)
{
    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;
    return av_malloc(result);
}

该函数作用是:给数组分配大小为nmemb x size字节的内存。

形参nmemb:数组中元素的个数

形参size:数组中单个元素的大小,单位为字节。

返回值:成功返回一个指针,该指针指向分配的内存块,即指向已被分配内存的数组的开头;失败返回NULL。

(二)av_malloc_array函数的内部实现分析

av_malloc_array函数内部,首先通过size_mult函数检查形参nmemb和形参size相乘是否会溢出,并把它们相乘的结果保存到局部变量result中,如果溢出,返回NULL:

    if (size_mult(nmemb, size, &result) < 0)
        return NULL;

如果没有溢出,通过av_malloc函数分配内存块:

    return av_malloc(result);

二、av_realloc_array函数

(一)av_realloc_array函数的定义

av_realloc_array函数定义在源文件libavutil/mem.c中:

void *av_realloc_array(void *ptr, size_t nmemb, size_t size)
{
    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;
    return av_realloc(ptr, result);
}

该函数作用是:

情况1:如果形参ptr值为NULL,并且形参nmemb x size的值大于0,给数组分配一个新的内存块,该函数返回一个指向新分配的内存块的指针;

情况2:如果形参ptr指向一个已存在的内存块(也就是说数组已经被分配内存了),并且形参nmemb x size的值大于0,根据nmemb x size的值扩展(给数组分配更多内存)或缩小该内存块。新的大小(nmemb x size的值)可大可小,如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失。

形参nmemb:数组中元素的个数

形参size:数组中单个元素的大小,单位为字节。

返回值:成功返回指向被分配内存的指针,否则返回空指针NULL。

(二)av_realloc_array函数的内部实现分析

av_realloc_array函数内部,首先通过size_mult函数检查形参nmemb和形参size相乘是否会溢出,并把它们相乘的结果保存到局部变量result中,如果溢出,返回NULL:

    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;

如果没有溢出,通过av_realloc函数分配或重新分配(更改动态分配的内存大小)一个内存块:

    return av_realloc(ptr, result);


http://www.kler.cn/news/362328.html

相关文章:

  • 国家信息安全水平考试(NISP一级)最新题库-第十七章
  • 【Vue3】将 Element Plus 引入 Vue3 项目
  • 【Axure高保真原型】标签管理可视化驾驶舱长页面案例
  • docker环境安装mongoDB实现平滑迁移实战
  • 探索MySQL数据库的高级功能:迈向高效数据管理的深度之旅
  • 京东大模型革命电商搜推技术:挑战、实践与未来趋势
  • Go_Parser部署、使用与原理分析
  • DOIP协议介绍-1
  • LeetCode 3185. 构成整天的下标对数目 II
  • MySQL8.0主从同步报ERROR 13121错误解决方法
  • VisionPro 手部骨骼跟踪 Skeletal Hand Tracking 虚拟首饰
  • Go:strings包的基本使用
  • Qt学习笔记第21到30讲
  • 『 Linux 』HTTP(三)
  • 【火山引擎】语音合成 | HTTP接口 | 一次性合成 | python
  • AnaTraf | 网络流量分析仪:网络故障排除的利器
  • 038_基于php校园Flea Market售货平台
  • C/C++:指针数组与数组指针
  • C++:模板(2)
  • AI+云原生时代,高校该如何创新教育模式
  • git取消被跟踪的文件并忽略
  • 分享一位教授关于VLAN标签在交换机中的转发原理的教学
  • 线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的几何间隔 公式解析
  • 数据结构与算法:高级数据结构与实际应用
  • <el-input-number> 回车自动失去焦点
  • 如何在Python网络爬虫中处理动态网页?