C/C++动态内存管理

来源:互联网 发布:有什么推广软件 编辑:程序博客网 时间:2024/06/11 19:59
目录:
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)的乘积:16int *p3 = (int*)realloc(p2,sizeof(int)*6);free(p1);//free(p2);这里不需要free(p2),因为p2给了reallocfree(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)的空间并初始化为3int* p3 = new int[4];//动态分配12个字节(3个int)的空间delete p1;delete p2;delete[] p3;}


1:总结并剖析malloc/free和new/delete之间关系和差异。
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);}



原创粉丝点击