delete[] 是否等于每个元素删除。 C++
Is delete[] equal to per element delete. c++
各位!
假设我正在编写数组 class 并希望优化构造
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 ();
}
您需要在 delete
数据之前先调用析构函数。
// First step
for ( int i = 0; i < size; ++i ) {
data_[i].~T();
}
// Second step
delete [] data;
// 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;
表达式delete[] data必须匹配在堆上创建数组的new T[],这样T是*data的类型。否则程序的行为是未定义的(5.3.5)。
在您的示例中,data 和 *data 的类型未知。如果 T 不是 char,则行为未定义。
您应该不调用delete[]数据,即使在循环中调用析构函数之后也是如此。最好调用 delete[] reinterpret_cast(data) 以避免未定义的行为。 T 类型的析构函数必须在释放内存之前调用。
各位!
假设我正在编写数组 class 并希望优化构造
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 (); }
您需要在 delete
数据之前先调用析构函数。
// First step
for ( int i = 0; i < size; ++i ) {
data_[i].~T();
}
// Second step
delete [] data;
// 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;
表达式delete[] data必须匹配在堆上创建数组的new T[],这样T是*data的类型。否则程序的行为是未定义的(5.3.5)。
在您的示例中,data 和 *data 的类型未知。如果 T 不是 char,则行为未定义。
您应该不调用delete[]数据,即使在循环中调用析构函数之后也是如此。最好调用 delete[] reinterpret_cast