ffmpeg 幂等中的 av_free* 函数是否为幂等函数
Are the av_free* functions in ffmpeg idempotent?
具体来说,我正在查看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_freep
对av_freep(&pointer_to_data);
释放的内存幂等。您的构建可能不是这种情况。
others
此外,avformat_free_context
调用的其他一些函数是幂等的。它们通过清除指针和执行 NULL 检查或减少数组索引以防止双重释放来实现此目的。示例包括 ff_free_stream
和 av_opt_free
。
avformat_free_context
avformat_free_context
将在尝试释放上下文之前执行 NULL 检查。因此,如果您将 NULL 传递给它,则不必担心。但是,如果您双重释放AVFormatContext
,您最终将执行低级双重释放,因为avformat_free_context
直接在AVFormatContext
上调用av_free
。
建议
释放上下文时最安全的做法是:
avformat_free_context(pcontext);
pcontext = NULL;
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 为什么 free() 函数不将内存返回给操作系统?
- emplace_back和push_back给出错误'double free or corruption (fasttop)'尽管定义了复制和移动构造函数
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
- C++ ecliipse free():函数末尾的指针无效
- 在析构函数中检测到"Trying to free invalid pointer"错误
- 来自单独.cpp文件中同一命名空间的 free 函数,C++ 中无法识别
- 显式调用析构函数时的 C++ 内存错误 ("double free or corruption"
- 为什么基类析构函数调用free
- QList析构函数行为-对列表中的指针调用delete/free()
- 为什么 gcc 不编译这个调用 free() 函数的琐碎代码?
- 编写一个DLL来加载msvcr80.dll并公开free()函数
- 从free函数与member函数返回move-only类型