В частности, я смотрю на avformat_free_context
, В обычном исполнении моего кода, avformat_free_context
называется соответствующим образом. Я также хотел бы назвать его в деструкторе класса, в случае, если был исключительный случай, который вызвал код, использующий AVFormatContext
вернуться рано. Правильно ли ведут себя свободные функции ffmpeg при вызове уже освобожденных структур данных?
Ссылки на определения функций; посмотреть на себя!
av_freep
avformat_free_context
звонки av_freep
на некоторых указателях, проведенных AVFormatContext
который не выполняет NULL
проверьте перед передачей адрес памяти, которая будет освобождена av_free
(который, по сути, просто призыв к 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
звонки av_free
прямо на AVFormatContext
,
Самое безопасное, что можно сделать при освобождении контекста:
avformat_free_context(pcontext);
pcontext = NULL;
Других решений пока нет …