负责分配,释放和复制内存的功能。
所有内存分配功能都具有INT_MAX字节的内置上限。 这可以使用av_max_alloc()进行更改,但是在执行此操作时要格外小心。
一、函数
| void * | av_malloc (size_t size) av_malloc_attrib 1(1) |
参数:size:要分配的内存块的大小(以字节为单位)
返回:指向分配的块,如果块不能被分配,则为NULL
| void * | av_mallocz (size_t size) av_malloc_attrib 1(1) |
参数:size:要分配的内存块的大小(以字节为单位)
返回:指向分配的块,如果块不能被分配,则为NULL
| static void * | av_malloc_array (size_t nmemb, size_t size) |
| static void * | av_mallocz_array (size_t nmemb, size_t size) |
| void * | av_calloc (size_t nmemb, size_t size) av_malloc_attrib |
创建与calloc()C函数对称。
| void * | av_realloc (void *ptr, size_t size) 1(2) |
如果ptr为NULL并且size> 0,则分配一个新的块。 如果大小为零,则释放ptr指向的内存块。 否则,根据大小扩展或缩小内存块。
参数:ptr:指向已经分配了av_realloc()或NULL的内存块的指针
size:要分配或重新分配的内存块的大小(以字节为单位)
返回:指向新重新分配的块的指针,如果块无法重新分配或该函数用于释放内存块,则为NULL
警告:与av_malloc()不同,返回的指针不能保证正确对齐。
| av_warn_unused_result int | av_reallocp (void *ptr, size_t size) |
如果* ptr为NULL并且size> 0,则分配一个新的块。 如果大小为零,则释放* ptr指向的内存块。 否则,根据大小扩展或缩小内存块。
参数:ptr:指向已分配有av_realloc()的内存块的指针,或指向NULL的指针。 指针在成功时更新,或者在失败时释放。
size:要分配或重新分配的内存块的大小(以字节为单位)
返回:零成功,失败时出现AVERROR错误代码
警告:与av_malloc()不同,分配的内存不能保证正确对齐。
| void * | av_realloc_f (void *ptr, size_t nelem, size_t elsize) |
此功能与av_realloc()执行相同的操作,除了:
1、在检查整数溢出的乘法结果之后,需要两个大小的参数并分配nelem * elsize字节。
2、它在出现故障时释放输入块,从而避免了经典的内存泄漏
buf = realloc(buf);
if (!buf)
return -1;模式。
| void * | av_realloc_array (void *ptr, size_t nmemb, size_t size) |
| int | av_reallocp_array (void *ptr, size_t nmemb, size_t size) |
| void * | av_fast_realloc (void *ptr, unsigned int *size, size_t min_size) |
如果给定的缓冲区为NULL,则会分配一个新的未初始化缓冲区。
如果给定的缓冲区不够大,重新分配失败,则返回NULL,并将* size设置为0,但是原始缓冲区不会被更改或释放。
一个典型的使用模式如下:
uint8_t *buf = ...;
uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed);
if (!new_buf) {
// Allocation failed; clean up original buffer
av_freep(&buf);
return AVERROR(ENOMEM);
}参数:ptr:已经分配缓冲区,或NULL
size:指向当前大小的缓冲区ptr。 成功时,*尺寸会更改为min_size,如果出现故障则更改为0
min_size:新大小的缓冲区ptr
返回:ptr如果缓冲区足够大,如果缓冲区不够大,则指向新重新分配缓冲区的指针,否则为NULL
| void | av_fast_malloc (void *ptr, unsigned int *size, size_t min_size) |
与av_fast_realloc()相反,当前的缓冲区内容可能不会被保留,并且出现错误时,旧缓冲区被释放,因此不需要特殊处理来避免memleaks。
* ptr被允许为NULL,在这种情况下,如果size_needed大于0,则始终会发生分配。
uint8_t *buf = ...;
av_fast_malloc(&buf, ¤t_size, size_needed);
if (!buf) {
// Allocation failed; buf already freed
return AVERROR(ENOMEM);
}参数:ptr:指向指向已分配缓冲区的指针。 * ptr将成功覆盖指向新缓冲区的成功或失败时为NULL
size:指向缓冲区的当前大小* ptr。 *成功时,尺寸会更改为min_size,如果出现故障则更改为0
min_size:新的缓冲区大小* ptr
| void | av_fast_mallocz (void *ptr, unsigned int *size, size_t min_size) |
像av_fast_malloc()一样,但是所有新分配的空间都被初始化。 重新使用的缓冲区不被清除。
* ptr被允许为NULL,在这种情况下,如果size_needed大于0,则始终会发生分配。
参数:ptr:指向指向已分配缓冲区的指针。 * ptr将成功覆盖指向新缓冲区的成功或失败时为NULL
size:指向缓冲区的当前大小* ptr。 *成功时,尺寸会更改为min_size,如果出现故障则更改为0
min_size:新的缓冲区大小* ptr
| void | av_free (void *ptr) |
参数:ptr:指向应释放内存块的指针。
注意:显式允许ptr = NULL。
建议您使用av_freep(),以防止留下悬挂指针。
| void | av_freep (void *ptr) |
uint8_t *buf = av_malloc(16);
av_free(buf);
// buf now contains a dangling pointer to freed memory, and accidental
// dereference of buf will result in a use-after-free, which may be a
// security risk.
uint8_t *buf = av_malloc(16);
av_freep(&buf);
// buf is now NULL, and accidental dereference will only result in a
// NULL-pointer dereference.参数:ptr:指向应该释放的内存块的指针
注意:* ptr = NULL是安全的,不会导致任何操作。
| char * | av_strdup (const char *s) av_malloc_attrib |
参数:s:要复制的字符
返回:指向一个新分配的字符串,包含一个s的副本,如果该字符串不能被分配,则返回NULL
| char * | av_strndup (const char *s, size_t len) av_malloc_attrib |
参数:s:要复制的字符
len:生成的字符串的最大长度(不计算终止字节)
返回:指向一个新分配的字符串,包含一个子字符串s或NULL(如果该字符串不能被分配)
| void * | av_memdup (const void *p, size_t size) |
参数:p:缓冲区要复制
size:复制缓冲区大小(以字节为单位)
返回:指向不能分配缓冲区的新分配缓冲区的指针,该缓冲区包含p的副本或NULL
| void | av_memcpy_backptr (uint8_t *dst, int back, int cnt) |
参数:dst:目的缓冲区
back:开始复制的字节数(即重叠窗口的初始大小); 必须> 0
cnt:要复制的字节数 必须> = 0
注意:cnt> back是有效的,这将复制我们刚刚复制的字节,从而创建一个周期长度为背的重复模式。
本文详细介绍了内存管理中常用的函数,包括内存分配(av_malloc, av_mallocz), 再分配(av_realloc, av_fast_realloc),释放(av_free, av_freep),复制(av_strdup, av_strndup)等功能,并解释了它们的使用场景和注意事项。
1111

被折叠的 条评论
为什么被折叠?



