C/C++动态内存管理

C/C++动态内存管理

  1. C: malloc、calloc、realloc、free
  2. C++:new\delete、new[]\delete[]
  3. malloc/free与new/delete
  4. 实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
  5. operate new/operate delete

malloc、calloc、realloc、free

  • void* malloc(size_t size) 在内存堆空间中申请一块固定大小的空间,返回起始位置指针,没申请到返回NULL。
  • void* calloc (size_t num, size_t size)在内存中申请 个数*类型大小 的数组空间,返回\~\~同上\~\~
  • void* realloc(void* memblock, size_t size) 将所传指针指向的空间调整为指定大小,返回新空间起始位置。
  • free 释放所指空间。
  • malloc、calloc、realloc要分别与free组合使用,避免内存泄漏;要将返回的指针进行强制类型转换。

new\delete、new[]\delete[]

  • new TYPE 在内存中申请一块 TYPE 类型大小的空间,返回相应类型的指针。并调用构造函数初始化,可以跟 () 传参初始化。
  • delete P 自动识别 *P 类型,调用析构函数并释放该空间,与new匹配使用。
  • new TYPE[N] 在内存中申请 N 块 TYPE 类型大小的空间,返回 TYPE 型的指针。并调用N次构造函数初始化,悄悄告诉大家:可以跟 {} 传参初始化。
  • delete[] P 自动识别 *P 类型,由编译器识别并调用 N 次析构函数并释放该空间,与 new[] 匹配使用。
    这里写图片描述

malloc/free与new/delete

  • 都是动态内存管理入口
  • malloc/free是C/C++库函数,new/delete是C++操作符
  • malloc/free只负责申请/释放空间,new/delete还要调用构造/析构函数
  • malloc 使用时要自己计算空间大小,返回 void* 指针,使用指针要自己强转;new 会自己计算空间大小,返回相应类型指针

实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。

  • 先看代码
  #define NEW_ARRAY(P, TYPE, N) \
    do{                                                 \
        int* P_NEW = (int*)malloc(sizeof(TYPE)*N + 4);  \
        ((int*)P_NEW)[0] = N;                           \
        P = (TYPE*)(P_NEW + 1);                         \
        int I_NEW = 0;                                  \
        for (; I_NEW < N; I_NEW++)                      \
            new(P + I_NEW)TYPE;                         \
    } while (false);

#define DELETE_ARRAY(P, TYPE) \
    do{\
        int n = *((int*)P - 1); \
        while (n--)\
        (P[n]).~TYPE(); \
        free((int*)P - 1); \
    } while (false);
  • do{}while(false) 是为了生成一个局部域,定义和使用临时变量,避免变量重定义。
  • 在前面多申请四字节空间保存一个 int 型变量,记录数组元素个数。

operate new/operate delete

  • operate new/operate delete的作用和 malloc/free 的作用完全相同,只是申请或释放空间。
  • new/delete 是通过 operate new/operate delete 来申请/释放空间的。
  • operate new/operate delete 事实上只是 malloc/free 的一层封装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值