關於ffmpeg內存管理函數av_malloc和av_free/av_freep

最近在項目中,需要自己在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是任何類型都可以適配的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章