Ffmpeg, c++, утечка памяти, что я делаю не так?

Итак, я создал это приложение, которое использует rtsp-поток IP-камер и делает с ним забавные вещи, однако у меня есть небольшая утечка памяти, которую я только что зафиксировал.

Если я просто запустил это

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

Он будет просто расти, расти и расти ... Так чего же мне не хватает?

Я использую порт ffmpeg для Windows, и моя версия 58.9.100.0 Может быть, это утечка в самом FFMPEG?

Обратитесь к руководству: ffmpeg.org/doxygen/3.2/… Совершенно ясно, что вам нужно бесплатно.

Kerrek SB 10.09.2018 10:56

Вау ... за два отрицательных голоса ... Большое спасибо за ... то, что вы классный человек, продолжайте в том же духе и передайте от меня привет на 4chan. Потом.

user1257043 10.09.2018 11:42
2
2
248
1

Ответы 1

Из документации:

If pkt->buf is NULL, then the packet is valid until the next av_read_frame() or until avformat_close_input(). Otherwise the packet is valid indefinitely. In both cases the packet must be freed with av_packet_unref when it is no longer needed.

Что-то вроде этого?

 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.

Спасибо, на самом деле это был мой исходный код, я просто продолжал удалять код, пока не перешел на barebone-систему, а он все еще протекал ... Фрагмент кода, который вы предлагаете, все еще протекает. Тем не менее, спасибо за усилия. PS: Я понимаю, что FFMPEG является отраслевым стандартом, поэтому очевидно, что он работает, однако я использую не каждый день и использую порт Windows. Я размышлял, не потерялось ли что-то при переводе.

user1257043 10.09.2018 11:44

ты уверен, что здесь протекает? Вы уверены, что это вообще утечка, а не системный эффект предварительного выделения (время выполнения не освобождает выделенную память для ОС для последующего использования). Как диагностировать утечку? См .: trac.ffmpeg.org/ticket/2534

Swift - Friday Pie 10.09.2018 11:48

Что ж, вы снова поймали меня, извините за то, что я не был гроссмейстером C++, я взломал C / C++ в молодости, но оплачиваю свои счета за кодирование Java в течение длительного времени ... Я наблюдаю за распределением памяти диспетчера задач, и это просто ... .. продолжает расти.

user1257043 10.09.2018 11:50

@MrSmith Ну, nix cat /proc/meminfo или минимальный диспетчер задач Windows показывают общий объем зарезервированной + используемой памяти. В Windows отображение использования ресурсов (на WIn7, я не знаю его аналога на Win10) могло показать разницу. В противном случае вам понадобится какое-то программное обеспечение или библиотека для динамической проверки, которая отслеживала бы вызовы выделения \ освобождения. В MS Compiler было несколько низкоуровневых инструментов, но мне лучше выбрать специальный инструмент.

Swift - Friday Pie 10.09.2018 11:53

Было бы более продуктивно использовать отладчик памяти, такой как ASAN или Valgrind, в ваших модульных тестах, чтобы вы могли обнаружить в изоляции, есть ли утечка какой-либо части вашего кода.

Kerrek SB 10.09.2018 12:20

Другие вопросы по теме