关于av_freep

来源:互联网 发布:多益网络招聘坑人 编辑:程序博客网 时间:2024/05/22 02:04

向av_freep传入的是指向某个内存区域的指针地址(也可以说指向这个指针的指针)

该函数用来释放掉这块内存区域。


void av_freep(void *arg)

{
    void **ptr = (void **)arg;
    av_free(*ptr);
    *ptr = NULL;

}



这么设计应该是为了改变指针arg本身,所以函数内部ptr才被设计为指向指针arg的指针指针


arg是个地址,该地址存放指向某个内存区域的指针的地址。 arg=&buffer,arg是指针buffer的内存地址。


 void **ptr = (void **)arg;   *ptr就是指向arg的指针。 *ptr=&arg



传入arg的地址给av_free,释放掉arg指向的内存地址,即指针buffer被释放掉,再也找不到指针buffer了。这时候buffer可能是野指针,置buffer为NULL。



void av_fifo_free(AVFifoBuffer *f)
{
    if (f) {
        av_freep(&f->buffer); //freep在调用了free之后,会置空指针。f->buffer 被释放,并置为NULL。
        av_free(f);  //指针f被释放。
    }
}


============================

向av_freep传入的是指向某个内存区域的指针地址(也可以说指向这个指针的指针)


AVFifoBuffer *av_fifo_alloc(unsigned int size)
{
    AVFifoBuffer *f= av_mallocz(sizeof(AVFifoBuffer));
    if (!f)
        return NULL;
    f->buffer = av_malloc(size);
    f->end = f->buffer + size;
    av_fifo_reset(f);
    if (!f->buffer)
        av_freep(&f);  //buffer分配失败,freep掉fifo,然后返回fifo。
    return f;
}


void av_fifo_free(AVFifoBuffer *f)
{
    if (f) {
        av_freep(&f->buffer); //freep在调用了free之后,会置空指针。
        av_free(f);
    }
}

=======================================

真正看不懂的是av_free啊。。。

void av_free(void *ptr)
{
#if CONFIG_MEMALIGN_HACK
    if (ptr) {
        int v= ((char *)ptr)[-1];
        av_assert0(v>0 && v<=ALIGN);
        free((char *)ptr - v);
    }
#elif HAVE_ALIGNED_MALLOC
    _aligned_free(ptr);
#else
    free(ptr);
#endif
}



======================

http://libav.org/doxygen/master/group__lavu__mem.html

void av_free(void * ptr )  

Free a memory block which has been allocated with av_malloc(z)() or av_realloc().

Parameters:
 ptr Pointer to the memory block which should be freed.
Note:
ptr = NULL is explicitly allowed.
It is recommended that you use av_freep() instead.
See also:
av_freep()
void av_freep(void * ptr )  

Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer pointing to it to NULL.

Parameters:
 ptr Pointer to the pointer to the memory block which should be freed.
See also:
av_free()

原创粉丝点击