内存管理
概述
内存管理是指软件运行时系统内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
接口定义
申请内存
void *aos_malloc(size_t size);
从系统堆中分配size字节内存区域
参数:
- size: 要分配内存区域的字节数
返回值:
- 如果分配成功,返回所分配的内存区域起始地址指针;如果失败,返回NULL
示例代码
char *ptr = NULL;
size_t size = 64;
ptr = (char*)aos_malloc(size);
if (NULL == ptr) {
printf("aos_malloc failed\r\n");
...
}
按对齐大小申请内存
void *aos_malloc_align(size_t alignment, size_t size);
从系统堆中分配size字节内存区域,其地址与指定的对齐大小对齐
参数:
- alignment:对齐大小
- size: 要分配内存区域的字节数
返回值:
- 如果分配成功,返回所分配的内存区域起始地址指针;如果失败,返回NULL
示例代码
char *ptr = NULL;
size_t alignment = 64;
size_t size = 64;
ptr = (char*)aos_malloc_align(alignment, size);
if (NULL == ptr) {
printf("aos_malloc_align failed\r\n");
...
}
申请内存并清零
void *aos_zalloc(size_t size)
从系统堆中分配size字节内存区域,并将内存初始化填充0
参数:
- size: 要分配内存区域的字节数
返回值:
- 如果分配成功,返回所分配的内存区域起始地址指针;如果失败,返回NULL
示例代码
char *ptr = NULL;
size_t size = 64;
ptr = (char*)aos_zalloc(size);
if (NULL == ptr) {
printf("aos_zalloc failed\r\n");
}
申请多块内存
void *aos_calloc(size_t size, size_t num);
从系统堆中分配size * num字节连续内存区域,并将内存区域初始化填充0
参数:
- size : 每个内存区域单元的字节数
- num: 要分配内存区域单元个数
返回值:
- 如果分配成功,返回所分配的内存区域起始地址指针;如果失败,返回NULL
示例代码
char *ptr = NULL;
size_t size = 64;
size_t n = 10;
ptr = (char*)aos_calloc(size, n);
if (NULL == ptr) {
printf("aos_calloc failed\r\n");
}
重新调整所分配的内存块的大小
void *aos_realloc(void *mem, size_t size)
如果mem指针为NULL,则新分配size大小的内存区域;如果mem指针非NULL,先判断原指针mem是否有足够的连续空间,如果有,扩大mem指向的地址,并且将mem指针返回,如果空间不够,按照size指定的大小分配空间(size的大小可以比原mem内存大,也可以比原mem内存小)。在分配成功的前提下,将原有数据从mem指向的内存区域拷贝到新分配的内存区域,而后释放原来mem所指内存区域,同时返回新分配的内存区域的首地址,若分配失败,则不释放原来的内存区域,并返回NULL。 对于拷贝数据的大小,如果新分配的内存区域size比原来mem指向内存区域大,则只拷贝原来mem指向内存区域长度字节数据到新分配的内存区域;否则,只拷贝size字节的数据到新分配的内存区域。
参数:
- mem: 原内存区域起始地址指针
- size:本次操作期望新分配的内存区域大小
返回值:
- 如果分配成功,返回新分配的内存区域起始地址指针;如果失败,返回NULL
示例代码
char *ptr = NULL;
char *newptr = NULL;
size_t size = 64;
ptr = (char*)aos_malloc(size);
if (NULL == ptr) {
printf("aos_malloc failed\r\n");
...
}
...
size = 100;
newptr = (char*)aos_realloc(ptr, size);
if (NULL == ptr) {
printf("aos_realloc failed\r\n");
}
释放分配的内存
void aos_free(void *mem)
将从系统堆中分配的内存区域释放
参数:
- mem: 要释放的内存区域起始地址指针
返回值:
- 无
示例代码
char *ptr = NULL;
size_t size = 64;
ptr = (char*)aos_malloc(size);
if (NULL == ptr) {
printf("aos_malloc failed\r\n");
...
}
...
aos_free(ptr);
释放按对齐大小分配的内存
void aos_free_align(void *ptr);
将从系统堆中按对齐大小分配的内存区域释放
参数:
- ptr: 要释放的内存区域起始地址指针
返回值:
- 无
示例代码
char *ptr = NULL;
size_t alignment = 64;
size_t size = 64;
ptr = (char*)aos_malloc_align(alignment, size);
if (NULL == ptr) {
printf("aos_malloc_align failed\r\n");
...
}
...
aos_free_align(ptr);