2

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

4

1 回答 1

2

不,并非所有人都是。

链接到函数定义;你自己看!

av_freep

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

av_free

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

others

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

avformat_free_context

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

建议

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

avformat_free_context(pcontext);
pcontext = NULL;
于 2014-03-19T02:20:11.030 回答