当前位置: 代码迷 >> 综合 >> 《C/C++学习指南》语法篇—笔记 (九、动态分配内存--malloc_free)
  详细解决方案

《C/C++学习指南》语法篇—笔记 (九、动态分配内存--malloc_free)

热度:70   发布时间:2024-02-06 01:03:31.0

《C/C++学习指南》语法篇—笔记 (九、动态分配内存--malloc_free

        • 内存管理器 MM
        • 非常重要:堆 (MM管理的内存区域)
        • malloc函数
        • free函数
        • 注:
        • 特点

问题:数组一块连续内存,长度常量)必须在代码里固定。

内存管理器 MM

MM,Memory Manager :系统中存在一个内存管理器,负责管理一堆闲置的内存。
MM提供服务:应用程序可以想MM申请(借出)一块指定大小的内存,用完之后再释放(还回)。

void* ptr = malloc(1024); //申请,从MM借出内存
free(ptr);  //释放,还回MM

注:

  • MM是个系统级的东西,所有的应用程序都向同一个MM申请内存。
  • 借出:在内存被借出时,MM只是把它管理的内存标记首地址,长度)了一下,表示该段内存已被占用。
  • 只要malloc,MM都会借出,不手动free,MM不会要求free,所以用户程序应自觉及时free。

非常重要:堆 (MM管理的内存区域)

MM管理的内存区域称为“”,Heap,相当于一个仓库。当应用程序要malloc时,就从仓库里登记借出。当free时,就将这一块内存放回仓库。

malloc函数

void* malloc(int size)$ 参数size:指定要申请的内存空间的大小$ 返回值:void* ,指向这一块内存地址 

MM不管你拿这块内存储存何种数据,所以返回void*,在使用malloc时,要把返回值转换成目标类型。如要申请一块空间存放100个int型对象,则↓,这块内存和数组没有本质区别,用法完全相同,数组本质就是一块连续内存。

int size = 100*sizeof(int);
int* p = (int*)malloc(size);

free函数

void free(void* ptr)$ ptr:先前malloc返回的内存地址$ 返回值:void* ,指向这一块内存地址

注:

  • 不是malloc的指针,不可以free
  • malloc的内存必须及时free
  • free必须free首地址
  • malloc的返回值需要检测 是不是返回NULL,没有内存了返回NULL。
  • free之后,该指针不能使用
  • malloc得到的内存可以在任意位置释放

特点

C/C++特点,使用指针直接操作内存。灵活高效但是主要逻辑缜密,不然容易崩溃