【发布时间】:2020-06-07 03:32:59
【问题描述】:
我正在使用 av_frame_alloc() 函数创建 AVFrame 对象并使用内部调用 av_frame_unref() 的 av_frame_free(&frame) 清除它,但它没有正确清理内存。我的应用的堆大小在运行时呈指数增长。
不工作:
AVFrame* frame = av_frame_alloc();
av_frame_free(&frame);
工作:
AVFrame* frame = av_frame_alloc();
av_free(frame->data[0]);
据我所知,av_frame_free() 调用 av_freep() 调用 av_free() 来释放动态内存。内存被清理,如果我直接使用 av_free(frame->data[0]) 而不是 av_frame_free(&frame)
【问题讨论】:
-
也许框架在某处被引用计数,因为我看不到代码,只能猜测。试试
av_frame_unref(frame)然后av_frame_free(&frame)。 -
av_frame_free() 内部调用 av_frame_unref(),如果它被引用。请找到源代码供您参考 [github.com/pockethook/player/blob/master/player.cpp#L104]
-
事情搞砸了,我不知道罪魁祸首是下一行的
av_frame_copy_props还是你的format_converter_。您最好切换到纯 C 并逐步检查(手动释放)。然后切换回智能指针 (C++)。 -
@thekamilz 谢谢。我会尽快检查并更新问题原因。
-
@thekamilz 它正在使用 av_image_alloc() 将一帧复制到另一帧。根据这个 [ffmpeg.org/doxygen/2.0/… 文档,分配的图像缓冲区应该由 av_freep(&frame->data[0]) 而不是 av_frame_free(&frame) 释放。我以为 av_frame_free() 内部调用了 av_freep(&frame->data[0])。