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
);