大家好!
假设我正在编写Array类并希望优化构造
data = reinterpret_cast<T*>(new char[sizeof (T) * size]);
for ( int i = 0; i < size; ++i ) {
new(&data[i]) T(some_value);
}
现在我想知道如何正确释放内存:
delete[] data;
for ( int i = 0; i < size; ++i ) {
data_[i].~T ();
}
答案 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;