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

时间:2022-07-26 16:06:34

针对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析构函数