C++ 释放动态分配的内存时,是否需要此额外步骤

C++ 释放动态分配的内存时,是否需要此额外步骤,c++,arrays,C++,Arrays,在动态分配阵列的扩展过程中,我发现自己在写以下内容: 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

在动态分配阵列的扩展过程中,我发现自己在写以下内容:

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; 
}

这是不是不必要的
第XX行:

不,您不应该为
数组的第一个
计数
元素调用
新字符
。您应该从
prevary
的第一个
count
元素进行复制

您根本不需要调用
newchar
。如果改用
nullptr
,则在删除元素时仍然可以安全地
删除[]数组[i]

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

  • 使用
    std::vector array
    ,它可以为您完成所有这些
  • 使用
    std::unique_ptr数组;标准:尺寸和容量并使用
    array=std::使_唯一(容量)重新分配并使用std::move移动(prevArray.get(),prevArray.get()+count,array.get())
  • 使用
    char**数组;标准:尺寸和容量,使用
    数组=新字符*[容量]重新分配并使用
    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; 
}

在您的示例中,需要
行XX:
,因为这行
数组[i]=newchar
new
分配的每个数据都必须通过
delete
delete[]
@Raffallo来释放,这是我的理解,但这样做似乎会破坏
array[i]
任何你试图重新发明轮子的特定原因,又称
,并且不使用
提供的智能指针来执行此操作?为什么要动态分配单个
char
s?此外,
容量*=2;数组=新字符*[static_cast(容量)]
--如果
new[]
抛出异常,则
容量
成员现在由于被更改而出错。我这样做的原因是
,因为出于某种原因,您动态分配每个字符
是为了允许使用strings@base10:这将不会使它与字符串一起工作。字符串必须连续存储,调用
new char
N次不会给您连续的分配,它会给您分散在各地的单个字符。而您的循环调用
new char
是没有用的,因为您会立即覆盖下一个循环中的指针,从而泄漏分配。@BenVoigt现在我明白了为什么他会对此感到困惑,谢谢您的提醒me@base10如果您曾经分配
数组[i]=new char[]
,然后您需要跟踪哪个
i
new char
,哪个有
new char[]
调用
delete
delete[]
。不这样更容易。
  /* instances variables */
  char **array;
  size_t count;
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; 
}