【问题标题】:Using delete[] on an array passed as an argument在作为参数传递的数组上使用 delete[]
【发布时间】:2020-08-13 07:12:35
【问题描述】:

假设您想在 C++ 中创建一个 realloc 函数。我想它可以像这样工作:

template<typename T>
void realloc(T** arr, int size, int original_size){
  T *newArr = new T[size];
  for(int i = 0; i<original_size;i++)
    newArr[i] = (*arr)[i];
  delete[] *arr;
  *arr = newArr;
}

现在我的问题是在这里使用delete[] 是否正确?据我所知,分配的内存大小是在运行时跟踪的,所以 C++ 知道要删除多少。像这样传递它时会保留它还是有更好的方法来做到这一点?

【问题讨论】:

  • C++中没有垃圾收集器
  • 该死的,出于某种原因,我认为有。我将编辑问题
  • 代码看起来不错。当然,如果您使用std::vector,您可以免费获得类似的东西(并且具有更好的实现)。
  • 唯一可以接受使用delete [] *arr 的时间是如果*arr 是由new [] 表达式产生的指针(或null,@987654327 @ 无效)。如果调用者传递了一个参数,使得*arr 不是这样一个表达式的结果,那么行为是未定义的。此外,在您的代码中,如果original_size 超过为*arr 分配的实际大小或original_size &gt; size,则循环的行为是未定义的(访问超过分配内存的末尾)。最后,您最好使用std::vector - 它负责干净地调整大小。
  • 使用智能指针或容器会比手动处理内存省很多力。

标签: c++ realloc


【解决方案1】:

现在我的问题是在这里使用 delete[] 是否正确?

可以,只要 *arr 是使用 new[] 分配的。

据我所知,分配的内存大小是在运行时跟踪的,因此 C++ 知道要删除多少。像这样传递它时是否保留了[...]?

我不太确定你在这里的意思。运行时会跟踪内存分配,是的。但是您必须明确将delete[] 用于数组(例如new int[10])delete 用于非数组(例如new MyClass())。

或者有更好的方法吗?

应该避免使用原始指针,即使是赤裸裸的new 现在也被认为是不好的做法。智能指针和像 std::vector 这样的 STL 容器是几乎所有场景的绝佳替代品。

【讨论】:

  • 抱歉不是编译器的意思。写的时候弄错了。感谢您的澄清
  • @Buffer 是的,修正了报价:)
  • 仅供参考,现在是“这些天”:)
  • @AsteroidsWithWings 啊,谢谢。我不是以英语为母语的人 :) 但似乎两者之间实际上存在差异。
  • “这些”和“那些”之间的区别是与说话者的距离(在某种程度上)。因此,“这些天”的字面意思是“包括今天在内的一个时间间隔或一组日子”,而“那些日子”是指“不包括今天的一个时间间隔或一组日子”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2016-03-30
  • 2011-08-12
  • 2015-10-13
  • 2016-09-26
相关资源
最近更新 更多