Являются ли функции av_free * в ffmpeg идемпотентными?

В частности, я смотрю на avformat_free_context, В обычном исполнении моего кода, avformat_free_context называется соответствующим образом. Я также хотел бы назвать его в деструкторе класса, в случае, если был исключительный случай, который вызвал код, использующий AVFormatContext вернуться рано. Правильно ли ведут себя свободные функции ffmpeg при вызове уже освобожденных структур данных?

2

Решение

Ссылки на определения функций; посмотреть на себя!

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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]