【发布时间】:2020-11-22 07:22:12
【问题描述】:
我的教授写了以下代码:
template <class T>
Set<T>& Set<T>::operator=(const Set<T>& set) {
if (this == &set) return *this;
T* data_temp = new T[set.size];
try {
for (int i = 0; i < size; ++i) {
temp_data[i] = set.data[i];
}
} catch (...) {
delete[] temp_data;
throw;
}
delete[] data;
data = temp_data;
size = maxSize = set.size;
return *this;
}
他指出temp_data[i] = set.data[I]; 调用operator=,我想知道为什么这不会泄漏内存?
例如,如果operator= 在第四个循环中失败,那么我们将删除temp_data,但是temp_data 中分配在operator= 代码中的前3 个单元格的值呢?我们不会释放他们。
【问题讨论】:
-
data_tempvstemp_data,这是一个错字吗? -
上面的代码没有内存泄漏。您关心的是哪个 operator=?
Set<T>::operator=或T::operator= -
上面的代码进行了一次分配和一次释放。因此它没有内存泄漏。可能在其他代码中分配的任何其他内存都是该其他代码的责任。如果其他代码也已正确编写,则不会发生内存泄漏。
-
@John 但是在 T::operator= 我们正在分配内存...
-
@Josh989 不,我们不是。是什么让你这么说?
标签: c++ exception memory-management memory-leaks try-catch