C/C++动态内存管理

目录:

  1. 总结并剖析malloc/free和new/delete之间的关系和差异。
  2. 剖析new/delete和new[]/delete[]做了什么?
  3. 实现NEW_ARRAY/DELETE_ARRAY宏,模拟实现new[]/delete[]申请和释放数组

  • 剖析malloc/free、new/delete。
  1. 它们都是动态管理内存的入口。
  2. malloc/free是C/C++标准库的函数,dew/delete是C++操作符。
  3. malloc/free只是动态分配内存空间/释放内存空间,而new/delete除了分配空间还会调用构造函数与析构函数进行初始化与清理工作。
  4. malloc/free需要手动计算类型大小且返回值为void*,new/delete可以自己计算类型大小并返回对应类型的指针。
  5. malloc分配内存失败返回NULL指针,new分配内存失败会抛出异常。

示例:

#include<iostream>
using namespace std;

class AA
{
public:
    AA(int a = 10)
        :_a(a)
    {
        cout << "AA(int a = 10)" << endl;
    }
private:
    int _a;
};

int main()
{
    int* p1 = (int*)malloc(sizeof(int));
    free(p1);

    AA* p2 = new AA(3);//(3)调用AA构造函数
    delete p2;

    return 0;
}

  • 剖析new/delete、new[]/delete[]做了什么?

这里写图片描述

注:operator new/operator delete为库函数并非运算符重载,operator new/operator deletemalloc/free功能相同都是动态分配内存空间,并且operator new/operator delete的实现是通过调用malloc/free来实现的,是malloc/free的一层封装,所不同的是,operator new/operator delete分配失败会抛出异常,而malloc/free分配失败会返回NULL指针。


  • 实现NEW_ARRAY/DELETE_ARRAY宏,模拟实现new[]/delete[]申请和释放数组
#define NEW_ARRAY(P,TYPE,N)                     \
    do                                          \
    {                                           \
    int* P_NEW = (int*)malloc(sizeof(TYPE)*N+4);\
    *P_NEW = N;                                 \
    P = (TYPE*)(P_NEW+1)                        \
    for (int i = 0; i < N; i++)                 \
    {                                           \
        new(P + i)TYPE;                         \
    }                                           \
    }while (false);

#define DELETE_ARRAY(P,TYPE) \
    do                      \
    {                       \
    int i = *((int*)P - 1); \
    while (i--)             \
    {                       \
        P[i].~TYPE();      \
    }                       \
    free((int*)P-1);        \
} while (false);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值