delete []是否等于每个元素删除。 C ++

时间:2015-10-23 15:05:47

标签: c++ memory-management delete-operator

大家好!

假设我正在编写Array类并希望优化构造

data = reinterpret_cast<T*>(new char[sizeof (T) * size]);
    for ( int i = 0; i < size; ++i ) {
        new(&data[i]) T(some_value);
}

现在我想知道如何正确释放内存:

  1. delete[] data;

  2. for ( int i = 0; i < size; ++i ) { data_[i].~T (); }

3 个答案:

答案 0 :(得分:2)

表达式 delete []数据必须与在堆上创建数组的 new T [] 相匹配,以便 T *数据的类型。否则,程序的行为是未定义的(5.3.5)。

在您的示例中,数据 *数据的类型未知。如果 T 不是 char ,则行为未定义。

即使在循环中调用析构函数之后,您也应调用删除[]数据。最好调用 delete [] reinterpret_cast&lt; char *&gt;(data)以避免未定义的行为。在释放内存之前必须调用 T 类型的析构函数。

答案 1 :(得分:1)

您需要在delete数据之前先调用析构函数。

// First step
for ( int i = 0; i < size; ++i ) {
    data_[i].~T();
}

// Second step
delete [] data;

答案 2 :(得分:0)

// First, you must call the destructors, so that objects will be destroyed
for ( int i = 0; i < size; ++i ) {
    data_[i].~T ();
}

// Then, deallocate memory from the heap.
delete[] data;