目录:
1:总结并剖析malloc/free和new/delete之间关系和差异。
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
- C语言用malloc/calloc/realloc/free进行内存管理
void Test() { int *p1 = (int*)malloc(sizeof(int)*4); int *p2 = (int*)calloc(4,sizeof(int));//分配的内存大小为:int的大小(4)与个数(4)的乘积:16 int *p3 = (int*)realloc(p2,sizeof(int)*6); free(p1); //free(p2);这里不需要free(p2),因为p2给了realloc free(p3); }C++动态内存管理 ( 通过new和delete动态内存管理)
new/delete 动态管理 对象new[]/delete[] 动态管理 对象数组
void test1() { int* p1 = new int;//动态分配4个字节(1个int)的空间的单个数据 int* p2 = new int(4);//动态分配4个字节(1个int)的空间并初始化为3 int* p3 = new int[4];//动态分配12个字节(3个int)的空间 delete p1; delete p2; delete[] p3; }
1>
它们
都是动态管理内存的入口
2>
maloc/free
是C/C++标准库的函数
new/delete
是C++操作符
3>
malloc/free
只是动态分配内存空间/释放空间
new/delete
除了分配空间(还会调用构造函数和析构函数进行初始化和清理(清理 成员))
4>
malloc/free
需要手动计算类型大小 返回值会void*(所以每次用的时候会强转类 型)
new/delete
可以自己计算类型的大小 返回对应类型的指针
5>
malloc
失败了 返回0
new
失败了 会抛出异常
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
new:
1.调用了operator new 分配空间
2.调用了构造函数初始化列表
delete:
1.调用析构函数清理对象
2.调用operator delete释放空间
new[N]:
1.调用了operator new 分配空间
2.调用N次构造函数分别初始化每个对象
delete[]:
1.调用了N次析构函数清理对象
2.调用了operator delete释放空间
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
#define NEW_ARRAY(ptr,type,n) \ do{ \ ptr = (type*)operator new(sizeof(type)*n+4); \ *((int*)ptr) = n; \ ptr = (type*)((char*)ptr+4); \ for(size_t i = 0;i < n;++i) \ new(ptr+i)type; \ }while(0); #define DELETE_ARRAY(ptr,type) \ do{ \ size_t n; \ n = *((int*)ptr-1); \ for(size_t i = 0;i < n;++i) \ (ptr+i)->~AA(); \ operator delete((char*)ptr-4); \ }while(0); class AA { public: AA() { cout<<"AA()"<<endl; } ~AA() { cout<<"~AA()"<<endl; } }; void test2() { AA* p1 = NULL; NEW_ARRAY(p1,AA,10); DELETE_ARRAY(p1,AA); }