C/C++动态内存管理
来源:互联网 发布:网络贷款公司合法的吗 编辑:程序博客网 时间:2024/06/06 02:11
目录:
- 总结并剖析malloc/free和new/delete之间的关系和差异。
- 剖析new/delete和new[]/delete[]做了什么?
- 实现NEW_ARRAY/DELETE_ARRAY宏,模拟实现new[]/delete[]申请和释放数组
- 剖析malloc/free、new/delete。
- 它们都是动态管理内存的入口。
- malloc/free是C/C++标准库的函数,dew/delete是C++操作符。
- malloc/free只是动态分配内存空间/释放内存空间,而new/delete除了分配空间还会调用构造函数与析构函数进行初始化与清理工作。
- malloc/free需要手动计算类型大小且返回值为void*,new/delete可以自己计算类型大小并返回对应类型的指针。
- malloc分配内存失败返回NULL指针,new分配内存失败会抛出异常。
示例:
#include<iostream>using namespace std;class AA{public: AA(int a = 10) :_a(a) { cout << "AA(int a = 10)" << endl; }private: int _a;};int main(){ int* p1 = (int*)malloc(sizeof(int)); free(p1); AA* p2 = new AA(3);//(3)调用AA构造函数 delete p2; return 0;}
- 剖析new/delete、new[]/delete[]做了什么?
注:operator new/operator delete
为库函数并非运算符重载,operator new/operator delete
与malloc/free
功能相同都是动态分配内存空间,并且operator new/operator delete
的实现是通过调用malloc/free
来实现的,是malloc/free
的一层封装,所不同的是,operator new/operator delete
分配失败会抛出异常,而malloc/free
分配失败会返回NULL指针。
- 实现NEW_ARRAY/DELETE_ARRAY宏,模拟实现new[]/delete[]申请和释放数组
#define NEW_ARRAY(P,TYPE,N) \ do \ { \ int* P_NEW = (int*)malloc(sizeof(TYPE)*N+4);\ *P_NEW = N; \ P = (TYPE*)(P_NEW+1) \ for (int i = 0; i < N; i++) \ { \ new(P + i)TYPE; \ } \ }while (false);#define DELETE_ARRAY(P,TYPE) \ do \ { \ int i = *((int*)P - 1); \ while (i--) \ { \ P[i].~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++动态内存管理
- 51Nod 1080 两个数的平方和
- 389. Find the Difference
- jquery 表单 清空
- HDU
- oracle8i 9i 10g中ig的意思
- C/C++动态内存管理
- Linux设备驱动remap_pfn_range() 和remap_page_range()
- 查询表相关的存储对象
- IOTA-663A,B Liquid Silicone rubber foam
- js中let、var、const定义变量的区别
- oralce10g服务
- PL/SQL模块
- Python文件传输
- [BZOJ3319][VijosP1423]汽车赛道