ffmpeg 幂等中的 av_free* 函数是否为幂等函数

Are the av_free* functions in ffmpeg idempotent?

本文关键字:函数 free 是否 av ffmpeg      更新时间:2023-10-16

具体来说,我正在查看avformat_free_context. 在我的代码的正常执行中,avformat_free_context被适当地调用。 我还想在类的析构函数中调用它,以防万一有特殊情况导致使用 AVFormatContext 的代码提前返回。 当调用已经释放的数据结构时,ffmpeg 自由函数的行为是否适当?

不,不是所有的都是。

链接指向函数定义;请自行查看!

av_freep

avformat_free_context调用av_freep AVFormatContext持有的一些指针,这些指针在将要释放的内存地址传递给av_free之前不执行NULL检查(这本质上只是对free的调用;见下文(。但是,它确实将指针设置为 NULL。

av_free

如果 ffmpeg 是在定义CONFIG_MEMALIGN_HACK的情况下编译的,av_free将在释放之前执行 NULL 检查。这将有效地使av_freepav_freep(&pointer_to_data);释放的内存幂等。您的构建可能不是这种情况。

others

此外,avformat_free_context调用的其他一些函数是幂等的。它们通过清除指针和执行 NULL 检查或减少数组索引以防止双重释放来实现此目的。示例包括 ff_free_streamav_opt_free

avformat_free_context

avformat_free_context将在尝试释放上下文之前执行 NULL 检查。因此,如果您将 NULL 传递给它,则不必担心。但是,如果您双重释放AVFormatContext,您最终执行低级双重释放,因为avformat_free_context直接在AVFormatContext上调用av_free

建议

释放上下文时最安全的做法是:

avformat_free_context(pcontext);
pcontext = NULL;