什么时候可以用delete替代delete[]

针对gcc编译器

C++内存分配和释放函数

//分配单个对象
operator new(std::size_t size)

//分配数组对象
operator new[](std::size_t size)

这两个函数都有size参数,作为传入要分配空间的大小,内部实现完全一样。只不过在分配数组空间之前,会在前面的空间,填入数组空间的大小。下面我猜测的伪代码

new Object[int size]{
    if(trival(Object析构函数)){
        Object *ptr = operator new[](size * sizeof(Object));
        for(int 0-> size){
            构造函数(ptr);
        }
        return ptr;
    }
    //析构函数有用,
    //需要析构的时候需要找到找到每个对象的this指针
    //因此在返回地址的前(-8,-4)个字节保存对象的大小
    else{
        //比没有用户自定义的析构函数多8个字节
        Object *ptr = operator new[](size * sizeof(Object) + 8);
        *(int *)(ptr) = size;
        return ptr + 8;
    }
}

根据上面的分析,我们知道了只有析构函数有用(non-trival)的Object,operator new[]才回在前面保存分配的数组个数。

什么时候可以用delete替换delete []

  1. 内置类型
  2. 用户自定义类型,但是有non-trival析构函数

转载于:https://www.cnblogs.com/biterror/p/7053412.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值