删除数组而不调用析构函数

时间:2013-11-05 13:27:06

标签: c++ arrays memory-management c++11 destructor

我正在开发一个具有高性能和内存需求的应用程序。我的意思是80核和500 GB的RAM。为了节省一些内存,我使用自己的动态数组(16 B开销)而不是std::vector(24 B开销),如果你有数十亿的话,这很重要。 我的问题涉及扩展看起来像这样的数组:

//private
template <class ArrType>
void DynamicArray<ArrType>::reallocate(unsigned newCapacity) {
    if (newCapacity < _size) return;
    if (capacity == newCapacity) return;

    ArrType * newArray = new ArrType[newCapacity];
    capacity = newCapacity;

    //for (unsigned i = 0; i < _size; i++) {
    //    newArray[i] = array[i];
    //}

    memcpy(newArray, array, _size * sizeof(ArrType));

    if(array) delete [] array;
    array = newArray;
}

正如您所看到的,非常标准的重新分配,但我测试了memcpy,它比使用for周期快了大约10倍。问题是当我调用delete时,它会调用ArrType对象的析构函数,这在ArrType有自己的动态分配时会出现问题。 newArray中的副本将使用已删除的内存。有没有办法在不调用析构函数的情况下删除旧数组?

1 个答案:

答案 0 :(得分:8)

将您的memcpy替换为:

std::move(array, array + _size, newArray);

并要求类型ArrType必须具有正确的移动或复制赋值运算符。

但在现实生活中,只需使用vector<ArrType>

实际上vector比这更好:而不是分配一个数组(如果类型有一个运行构造函数),然后移动分配(覆盖new刚刚执行的操作)它分配原始内存,然后使用移动构造函数和placement new。

所以,如果你绝对肯定需要vector版本使用size_type的较小类型而不是实现版本,我想要做的就是重新实现vector在这个改变的新名称下。您可以使用实施中的源来帮助您:这样您就可以在此面前解决此问题以及所涉及的所有其他问题。