1:malloc/free和new/delete之间关系和差异。
共同点:他们都是动态管理内存的入口
不同点:
(1)malloc/free是C/C++的标准库函数,而new/delete是C++操作符;
(2)malloc/free使用时要自己对于类型大小进行计算,返回值为void*;
new/delete使用时不需要自己计算类型大小,返回值为对应类型的指针;
(3)malloc/free只是动态分配内存空间,new/delete除了分配空间,还会调用构造函数和析构函数进行初始化和清理;
(4)malloc/free如果失败了返回0,new/delete如果失败了会抛异常。
2:new/delete、new[]/delete[]到底做了些什么事情
new: 先调用 operator new分配空间,然后调用构造函数初始化对象。
delete: 先调用析构函数清理对象,然后调用operator delete释放空间。
new[N]:先调用 operator new分配空间,然后调用N次构造函数初始化对象。
delete[]:先调用N次析构函数清理对象,然后调用operator delete释放空间。
3:NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
#define
_CRT_SECURE_NO_WARNINGS
#define
NEW_ARRAY(PTR,TYPE,N) \
do{ \
PTR = (TYPR*)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{ \
size_t N = *((int*)PTR
- 1); \
for
(size_t i = 0; i < N; i++) \
PTR[i].~TYPE(); \
PTR = (TYPE*)((char*)PTR
- 4); \
operator
delete(PTR); \
}
while
(false);