1:总结并剖析malloc/free和new/delete之间关系和差异。
1)他们都是动态内存管理的入口
2)malloc要计算空间大小,返回值要强转
new自动计算字节大小,返回值是相应类型的指针
3)malloc只开辟空间
new开辟空间+调用构造函数初始化
delete调用析构函数清理+释放空间
4)malloc是库函数
new是操作符
5)malloc失败返回0
new失败返回包异常
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
new:
1)调用operator new 开辟空间
2)调用构造函数初始化
2)调用 operator delete 释放空间
new[]:
1)调用operator new[]开辟空间,多开辟4字节空间保存数组对象个数
2)每个对象分别调用构造函数初始化
3)返回数组指针
delete[]:
1)指针前移获取数组对象个数n,调用n次析构函数
1)他们都是动态内存管理的入口
2)malloc要计算空间大小,返回值要强转
new自动计算字节大小,返回值是相应类型的指针
3)malloc只开辟空间
new开辟空间+调用构造函数初始化
delete调用析构函数清理+释放空间
4)malloc是库函数
new是操作符
5)malloc失败返回0
new失败返回包异常
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
new:
1)调用operator new 开辟空间
2)调用构造函数初始化
3)返回该指针
delete:
1)调用析构函数进行清理工作2)调用 operator delete 释放空间
new[]:
1)调用operator new[]开辟空间,多开辟4字节空间保存数组对象个数
2)每个对象分别调用构造函数初始化
3)返回数组指针
delete[]:
1)指针前移获取数组对象个数n,调用n次析构函数
2)调用 operator delete[] 释放空间
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组
NEW_ARRAY:
1)在PTR上开辟一个N个TYPE类型元素+4字节的空间
2)在该空间前4个字节保存对象的个数,为了delete[]做准备
3)PTR指针后移4字节,调用定位new的表达式进行初始化操作
#define NEW_ARRAY(PTR, TYPE, N) \
do{ \
PTR = (TYPE*)operator new (sizeof(TYPE)*N + 4); \
*((int*)PTR) = N; \
PTR = (TYPE*)((int*)PTR+1); \
for(int i=0; i<N; i++) \
{ \
new(PTR+i)(TYPE); \
} \
}while(false);
1)在数组前4个字节读取元素个数N
2)把每个对象进行析构函数调用
3)释放空间
#define DELETE_ARRAY(PTR, N) \
do{ \
N = *((*int)PTR - 1); \
int i = 0; \
for(i=0; i<N; i++) \
{ \
PTR[i].~TYPE(); \
} \
PTR = (TYPE*)((int*)PTR-4); \
operator delete PTR; \
}while(false);