C/C++动态内存管理

来源:互联网 发布:网络贷款公司合法的吗 编辑:程序博客网 时间:2024/06/06 02:11

目录:

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

原创粉丝点击