模拟实现new[]
#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);
//开辟空间:开辟TYPR*型空间给数组存放,加4是为了存放数组元素个数
//把第一个位置用来存放个数:开头部分要4个字节来存放个数,所以是整形去解引用
//将指针指向剩下的空间:接下来PTR指向四个字节之后的地址,也就是指向剩下用来存放数组元素的空间
//进行初始化:采用for循环去初始化数组的每个元素
模拟实现delete[]
#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);
//将存放的个数拿出来:int*型PTR指针减1也就是减4个字节指向存放个数的地方,解引用得到个数N
//将开辟的空间释放:采用for循环,调用析构函数~TYPE()释放每个元素PTR[i]存放的空间
//将用来存放个数的空间释放:字符型指针PTR减4指向存放个数的那四个字节处,强转成TYPE*型给PTR,
//采用operator delete()函数释放空间