释放动态分配的内存时是否需要执行此额外步骤

Is this extra step necessary when freeing dynamically allocated memory

本文关键字:执行 动态分配 内存 是否 释放      更新时间:2023-10-16

在动态分配数组的扩展过程中,我发现自己写了这个:

void HPQueue::expandCapacity() {
char **prevArray = array;
capacity *= 2;
array = new char*[static_cast<size_t>(capacity)];
for (int i = 0; i < capacity; i++) {
array[i] = new char;
}
for (size_t i = 0; i < count; i++) {
array[i] = prevArray[i];
LINE XX: delete prevArray[i]; <----------- This line seems to be the problem, Since it also deletes array[i]
}
delete[] prevArray; 
}

但是,如果构造函数最初看起来像这样,则此行是必需的:

HPQueue::HPQueue::() {
capacity = INITIAL_CAPACITY;
array = new char*[static_cast<size_t>(logSize)];
for (int i = 0; i < logSize; i++) {
array[i] = new char;
}
count = 0;
}

注意:

/* instances variables */
char **array;
size_t count;

LINE XX:没有必要吗?

不,您不应该为array的前count元素调用new char。您应该从prevArray的前count个元素复制。

根本不需要打电话给new char。如果改用nullptr,则在删除元素时仍然可以安全地delete[] array[i]

但你不应该这样做。按优先顺序:

  • 使用std::vector<std::string> array,它会为您完成所有这些工作。
  • 使用std::unique_ptr<std::unique_ptr<char[]>[]> array; std::size_t capacity;,随array = std::make_unique<std::unique_ptr<char[]>[]>(capacity);重新分配,随std::move(prevArray.get(), prevArray.get() + count, array.get());移动
  • 使用char **array; std::size_t capacity;array = new char*[capacity];重新分配,随std::copy_n(prevArray, count, array);移动

因此,如果您需要使用最后一个,您将获得

HPQueue::HPQueue()
: capacity(INITIAL_CAPACITY), 
array(new char*[INITIAL_CAPACITY]),
count(0)
{
std::fill_n(array, capacity, nullptr);
}
void HPQueue::expandCapacity() {
char **prevArray = array;
capacity *= 2;
array = new char*[capacity];
auto pos = std::copy_n(prevArray, count, array);
std::fill_n(pos, capacity - count, nullptr);
delete[] prevArray; 
}