当前位置: 首页 > 文档资料 > YoC 编程基础 >

内存管理

优质
小牛编辑
121浏览
2023-12-01

概述

内存管理是指软件运行时系统内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。

接口定义

申请内存

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);