【问题标题】:FFMPEG, C++, Memory leak, what am I doing wrong?FFMPEG,C++,内存泄漏,我做错了什么?
【发布时间】:2018-09-10 08:52:44
【问题描述】:

所以我构建了这个应用程序,它使用 IP 摄像机 rtsp 提要并用它做一些有趣的事情,但是我有一个小的内存泄漏,我现在才确定。

如果我只是运行这个

while (av_read_frame(input_format_context, &input_packet) >= 0) {}

它会不断增长……那么我错过了什么?

我使用的是 ffmpeg 的 windows 端口,我的版本是 58.9.100.0 会不会是 FFMPEG 本身的泄露?

【问题讨论】:

  • 查看手册:ffmpeg.org/doxygen/3.2/… 很清楚你需要释放什么。
  • 哇 .. 两次投反对票... 非常感谢... 成为了不起的人,继续保持下去,在 4chan 上向我问好。稍后。

标签: c++ memory-leaks ffmpeg


【解决方案1】:

来自文档:

如果 pkt->buf 为 NULL,则数据包有效,直到下一个 av_read_frame() 或直到 avformat_close_input()。否则包 无限期有效。在这两种情况下,数据包都必须被释放 av_packet_unref 不再需要时。

这样的?

 AVPacket *pPacket = av_packet_alloc();
 if (!pPacket)
 {
    logging("failed to allocated memory for AVPacket");
    return -1;
 }

 while (av_read_frame(pFormatContext, pPacket) >= 0)
 {
    auto  response = decode_packet(pPacket, pCodecContext, pFrame);
    if (response < 0)
        break;
    }

    av_packet_unref(pPacket);
  }

PS:不要成为货物崇拜的受害者,研究源代码。这绝不是一个完整的例子。有使用 ffmpeg 的工作项目。

【讨论】:

  • 谢谢,实际上那是我的原始代码,我只是一直在删除代码,直到我处于准系统并且它仍在泄漏。您建议的代码 sn-p 仍然泄漏。不过感谢您的努力。 PS:我意识到 FFMPEG 是行业标准,所以很明显它正在工作,但是,我不是每天都在使用,而是在使用 windows 端口。我正在考虑是否在翻译中丢失了一些东西。
  • 你确定它在这里泄漏了吗?您确定这根本是泄漏,而不是基于系统的预分配效应(运行时不会将分配的内存释放给操作系统以供以后使用)。如何诊断泄漏?见:trac.ffmpeg.org/ticket/2534
  • 好吧,你又抓到我了,我很抱歉我不是 C++ 大师,我年轻时破解过 C/C++,但花了很长时间编写 Java 的账单...我观察任务管理器内存分配,它只是....继续增长。
  • @MrSmith 好吧,nix cat /proc/meminfo 或 Windows 最小任务管理器显示总保留+已用内存。在 Windows 上,资源使用情况显示(在 WIn7 上,我不知道它在 Win10 上的模拟)可以显示差异。否则,您需要一些动态检查软件或库来跟踪分配\解除分配调用。 MS Compiler 有一些低级工具,但我最好使用专用工具
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2015-11-08
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多