最近在項目中,需要自己在ffmpeg中實現一個濾鏡,用到了大塊內存的申請和釋放。
於是用ffmpeg申請接口av_malloc,申請,釋放使用的av_freep。
然後問題就來了,莫名其妙的core掉了。怎麼也查不到原因,最後看到ffmpeg 的mem.h頭文件中的註釋,
av_malloc 申請的內存是用av_free釋放的,爲啥呢?
先看看av_freep 函數,這個函數有點誤導人。
void av_freep(void *arg)
{
void *val;
memcpy(&val, arg, sizeof(val));//這裏memcpy相當於解引用, val = *arg;
memcpy(arg, &(void *){ NULL }, sizeof(val)); // 同上 *arg = NULL;
av_free(val); // free(*arg);
}
//所以看出來什麼沒有,這個函數釋放二級指針,把一級指針傳遞進去釋放,當然會有問題。
av_free 沒什麼特別的,就是普通的釋放。
這裏用memcpy是因爲,傳進來的void *參數。已經和內部類型不匹配了。爲什麼這裏傳遞void *arg而不是void **arg呢?因爲如果void **arg,這個指針不是任意指針類型都能給其賦值的。只有void *arg是任何類型都可以適配的。