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>它们都是动态管理内存的入口
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);}
阅读全文
0 0
- 【C++】动态内存管理
- 【C++】动态内存管理
- 【C++】动态内存管理
- C语言动态内存管理
- c的动态内存管理
- C语言动态内存管理
- C语言动态内存管理
- C/C++动态内存管理
- C语言动态内存管理
- 【C++】C++动态内存管理
- C/C++动态内存管理
- c的动态内存管理
- C/C++动态内存管理
- c/c++动态内存管理
- C/C++动态内存管理
- C/C++动态内存管理
- C/C++动态内存管理
- C/C++动态内存管理
- 洛谷 1197 星球大战 并查集 解题报告
- 大数据Web工具Hue
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划
- Python学习(一)
- tf-Time travel时间穿梭
- C/C++动态内存管理
- D
- 数组排序之后相邻数的最大差值
- java中的堆和栈的解释,不错的非常详细
- 关于业务主键和逻辑主键
- 教你找回 git stash 数据中的数据
- C++中std是什么意思?
- bzoj 1220: [HNOI2002]跳蚤
- LeetCode 97. Interleaving String