C++动态内存管理
来源:互联网 发布:java web框架排行 编辑:程序博客网 时间:2024/06/08 02:25
1.C语言中malloc,calloc,realloc的不同
malloc/calloc/realloc用来在堆上开辟空间。
(1)malloc
void *malloc(size_t size);
malloc()在内存的动态存储区中分配一块长度为size字节的连续区域
(2)calloc
void *calloc(size_tnmemb,size_t size);
calloc()与malloc()相似,参数size为申请地址的单位元素长度,nemb为参数个数
(3)realloc
void *realloc(void *ptr,size_t size);
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,size是重新申请的地址空间的大小
它们三者的区别:
malloc不能初始化所分配的内存空间,需要用memset;
calloc会将所分配的空间中的每一位都初始化为0;
realloc 可以改变原有内存空间大小,原有内存的内容保持不变;若不能改变,将会开辟一段新的内存,但不会对新开辟的空间进行初始化
2.总结并剖析malloc/free和new/delete之间关系和差异。
C++通过new和delete动态管理内存
new/delete动态管理对象
new[ ]/delete[ ]动态管理对象数组
malloc/free和new/delete之间的区别和联系
1)它们都是动态管理内存的入口。
2)malloc/free是C/C++标准库函数,而new/delete是C++操作符。
3)malloc/free只是动态分配内存空间/释放空间,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理。
4)malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。
3.剖析new/delete、new[]/delete[]到底做了些什么事情。
new做了两件事
1)调用operator new分配空间;
2)调用构造函数初始化对象。
delete也做了两件事
1)调用析构函数清理对象;
2)调用operator delete释放空间。
new[ ]
1)调用operator new分配空间;
2)调用N次构造函数分别初始化每个对象。
delete[ ]
1)调用N次析构函数清理对象;
2)调用operator delete释放空间。
4.实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
//模拟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 (false);#define DELETE_ARRAY(PTR,TYPE) \do \{ \int N = *((int*)PTR - 1); \for (int i = 0; i < N; i++) \{ \ PTR[i].~TYPE(); \} \PTR = (TYPE*)((char*)PTR - 4); \operator delete(PTR); \}while (false);class AA{private :size_t i;public:AA(size_t i = 10){cout << "AA()" << endl;}~AA(){cout << "~AA()" << endl;}};int main(){AA* P2;NEW_ARRAY(P2, AA,10);DELETE_ARRAY(P2, AA);system("pause");return 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++动态内存管理
- JavaScript语法结构
- C++相对路径和绝对路径
- Notepad++如何设置字体格式 Notepad++字体设置方法
- Mysql 编译安装
- HDU 3038 How Many Answers Are Wrong(维护节点间关系的并查集)
- C++动态内存管理
- 剑指offer——从上到下打印二叉树
- 数字货币深度解析区块链POS和POW的区别
- ARM汇编指令MRS和MSR
- OutputStream练习
- asp.net core 项目打开报错
- Scala入门到精通——第十七节 类型参数(一)
- 一份烂工作会给你带来什么?
- redis编译安装