1 av_memdup()
av_memdup() 声明:
- 所属库:libavutil(lavf)
- 头文件:libavutil/mem.h
- 声明:函数内部将创建一块缓冲,从源缓冲区拷贝size大小的数据到该缓冲,并返回该缓冲的地址
/**使用av_malloc复制一块缓冲区 * Duplicate a buffer with av_malloc(). * * p指向需要被拷贝的缓冲区 * @param p Buffer to be duplicated * 需要拷贝的缓冲区大小 * @param size Size in bytes of the buffer copied * 返回新申请的缓冲区的地址,如果buffer申请失败,则返回NULL * @return Pointer to a newly allocated buffer containing a * copy of `p` or `NULL` if the buffer cannot be allocated */ void *av_memdup(const void *p, size_t size);
av_memdup() 源码:
- 源文件:libavutil/mem.c
void *av_memdup(const void *p, size_t size) { void *ptr = NULL; if (p) { ptr = av_malloc(size); if (ptr) memcpy(ptr, p, size); } return ptr; }
源码其实很简单,没有什么可说的。突然想到一点,那就是如果p指向的有效内存块(即已分配给程序使用)若是小于size,那么会是什么情况呢?写个简单的demo试试
2 小的测试
测试代码如下所示:
- 虽然src[10]空间并未分配给程序使用,但是仍然可以访问,因为c/c++不对指针越界进行检查,因此会访问到这些空间,而这些未分配的空间的值是不可预知的,因此,通常会导致未定义的行为出现。
- memcpy() 函数调用也不会进行指针越界的检查,单纯的将源指针指向的地址开始,拷贝size大小的字节数到目的指针
- 进一步,若目标指针处分配的内存大小不足size,那么,拷贝的size个字节数据会覆盖掉目的指针指向连续的size大小的内存,即便后续的内存还未分配,从而也会出现未定义的行为。