目录:
- 总结并剖析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);
2万+

被折叠的 条评论
为什么被折叠?



