ffmpeg中的av_free *函数是幂等的吗?

时间:2014-03-18 15:00:51

标签: c++ ffmpeg idempotent

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

1 个答案:

答案 0 :(得分:2)

不,不是所有人都是。

链接是函数定义;亲自看看!

av_freep

avformat_free_contextAVFormatContext持有的某些指针调用av_freep,这些指针在将要释放的内存地址传递给{之前不执行NULL检查{3}}(这实际上只是对free的调用;见下文)。但是,它确实将指针设置为NULL。

av_free

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

others

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

avformat_free_context

在尝试释放上下文之前,

avformat_free_context将执行NULL检查。因此,如果您将NULL传递给它,您不必担心。但是,如果您将AVFormatContext双倍释放,最终执行低级双重免费,因为avformat_free_context会直接调用av_free AVFormatContext

建议

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

avformat_free_context(pcontext);
pcontext = NULL;