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

标签 c++ ffmpeg idempotent

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

最佳答案

不,并非全部都是。

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

av_freep

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

av_free

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

其他

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

avformat_free_context

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

建议

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

avformat_free_context(pcontext);
pcontext = NULL;

关于c++ - ffmpeg 中的 av_free* 函数是幂等的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22483140/

相关文章:

C++ Windows - 如何从其 PID 获取进程路径(错误)

FFmpeg 会在音频覆盖前后创建一个小的可听 dropout_transition,我该如何删除它?

rest - PUT POST 是幂等的 (REST)

rest - HTTP 方法 POST 一定是幂等的吗?

c++ - UnixTime 到可读日期

c++ - QT 如何获取 XML 文件的最后一个节点?

c++ - 使用 Embarcadero C++ (Builder) 从 Word OLE 中检索和循环故事范围

macos - 将bash中带有空格的文件名脚本变量传递给外部程序(ffmpeg)失败

ffmpeg strftime 对 Windows 没有影响

java - Java中如何保证Closeable接口(interface)的close()方法的幂等性?