实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组

模拟实现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()函数释放空间


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值