C++动态内存管理
来源:互联网 发布:淘宝十大男模 编辑:程序博客网 时间:2024/05/22 01:32
1.malloc/free和new/delete之间关系和差异。
相同点:都是用来管理动态内存的,必须成对出现,因为一个用于申请动态内存,一个用于释放内存。
不同点:
- malloc/free是C++/C语言的标准库函数,new/delete是c++的运算符,对于非内部数据类型的对象而言,只有malloc、free是无法满足动态对象的要求的。因为对象在创建的时候会自动调用构造函数,对象消亡时会自动调用析构函数。因为malloc/free是库函数而不是运算符,不在编译器控制的范围内,不能够执行构造函和析构函数 。这种差别就是由于面向过程和面向对象的差异引起的。
- 函数的使用方法不同,可以看一下malloc/free的函数原型
void *malloc(size_t,size);void free(void pointer);
有函数原型可以看出使用malloc的返回类型是void,而且没有初始化,但对比new的使用可以明显看出new在使用时的做的工作比较多它不仅根究类型开辟出了空间,而且进行了初始化。所以相比于malloc,new更加安全方便。并且new还支持重载,显然malloc并不支持。
malloc比起new好处就在于malloc还有个与之对应的函数reallc,reallc的作用是在已开辟的空间后再开辟一些空间,而当reallc第一个参数为NULL时它的作用与malloc相同。calloc与malloc区别在于calloc在返回指向内存的指针之前把它初始化为0。
2.剖析new/delete、new[]/delete[]到底做了些什么事情。
3.实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
//用宏实现NEW_ARRAY和DELETE_ARRAY//开辟空间//将第一个位置用来存放个数//将p指针指向剩下的空间//进行初始化#define NEW_ARRAY(P,TYPE,N) \do \{int* P_NEW = (int*)malloc(sizeof(TYPE)*N + 4); \((int*)P_NEW)[0] = N; \P = (TYPE*)(P_NEW + 1); \for (int I_NEW = 0; I_NEW < N; I_NEW++) \ new (P + I_NEW)TYPE; \}while (false);//将存的个数拿出来//将开辟的空间释放//将用来存放个数的空间释放#define DELETE_ARRAY(P,TYPE) \do{ \ int n = *((int*)P - 1); \ while (n--) \ (P[n]).~TYPE(); \ free((int*)P - 1); \} while (false);
阅读全文
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++动态内存管理
- 利用sklearn实现简单的KNN
- 基于JavaMail的Java邮件发送:简单邮件发送
- 时间戳和随机数的总结以及显示年月日与时间的函数
- 面向对象——接口
- 微店 Android 插件化实践
- C++动态内存管理
- java异常处理之try...catch...finally详解
- 顺序容器
- Kotlin for Android(三)Kotlin数据类型
- 判断俩个链表是否相交,若相交求交点(考虑带环和不带环)
- 基于JavaMail的Java邮件发送:复杂邮件发送
- JavaScript正则表达式(基础、分组、懒惰匹配、反向引用和零宽断言)
- 虹膜识别(五):虹膜分割与图像归一化
- python10高阶函数