动态内存管理
来源:互联网 发布:贴吧群发软件 编辑:程序博客网 时间:2024/06/07 16:41
1:总结并剖析malloc/free和new/delete之间关系和差异。
C语言动态内存管理:
开辟空间: malloc calloc realloc
释放空间: free
C++动态内存管理:
开辟空间: new :开辟指定大小空间
new[ ] :开辟数组空间
释放空间:delete :释放空间
delete[ ]:释放数组空间
1:总结并剖析malloc/free和new/delete之间关系和差异。
(1)malloc/free 是C/C++标准库函数,new/delete是操作符。
(2)malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理。
(3)malloc/free需要手动计算类型大小,new/delete可以自己计算类型大小。
(4)malloc 失败了返回0,new失败了会抛异常。
new/delete动态管理对象,new[ ]/delete[ ]动态管理对象数组:
注意:malloc/free new/delete new[ ]/delete[ ] 一定要配套使用,否则可能会出现内存泄漏!!!
void Test(){int* p1 = new int; //动态的分配4个字节的空间int* p2 = new int(6);//动态的分配4个字节空间,并初始化为6int* p3 = new int[6];//动态的分配24个字节的空间delete p1;delete p2;delete[] p3;}
2:剖析new/delete、new[]/delete[]到底做了些什么事情。(1)new/delete
new做了两件事:1)调用operator new 分配空间;2)调用构造函数初始化对象.
delete做了两件事:1)调用析构函数清理对象;2)调用operator delete 释放空间.
(2)new[ ]/delete[ ]
new[ ]做了两件事:1)调用operator new分配空间;2)调用N次构造函数分别对每个对象进行初始化.
delete[ ]做了两件事:1)调用N次析构函数分别对每个对象进行清理;2)调用operator delete 释放空间.
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
(1)模拟实现new[ ]
#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(false);
(2)模拟实现delete[ ]
#define DELETE_ARRAY(PTR,TYPE) \do{ \for(size_t i = 0; i < N;i++) \PTR[i].~TYPE(); \PTR = (TYPE*)((char*)PTR-4); \operator delete(PTR); \}while(false);
!
- 动态内存管理
- 动态内存管理实例
- C++ 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理
- 动态内存管理类
- 【007】动态内存管理
- 动态内存管理
- 动态 内存管理
- 动态内存管理
- c++动态内存管理
- 动态内存管理
- 模板template
- Idea编写webservice案例
- C语言之数据类型
- item2使用Solarized主题
- Python3学习笔记12--urllib,BeautifulSoup
- 动态内存管理
- Java中枚举类型的使用
- sql中的case when详解
- 《spring源码深度解析》读书笔记之——环境搭建
- ubuntu14.04配置arm-linux-gcc4.4.3交叉编译环境
- python 多线程+queue
- 使用qsort对二维int型数组排序
- 阿里巴巴2018校招编程测试题
- Android抓包方法(二) 之Tcpdump命令+Wireshark