【问题标题】:Deleting an array of complex types删除复杂类型的数组
【发布时间】:2021-08-24 12:30:06
【问题描述】:

如果我有一个复杂的类 A,并且我定义了一个包含此类(或指向此类中的对象的指针)的数组,如果我使用 delete[],它是否会释放数组中每个元素的内容,然后数组本身,还是我必须手动释放所有元素(删除 arr[i])然后调用 delete[]?

** 我不允许使用 STL

【问题讨论】:

  • 请出示您的代码。 delete arr[i] 仅在数组元素是指针时有效,在这种情况下 delete[] 不会关心这些指针指向的对象
  • [专业提示] 不要使用new。请改用std::vector<T>。假设您的 T 有一个正常工作的析构函数,它将为您清理所有内容。
  • 尽量使用规则0(3/5/0)并使用vector,不要手动处理资源。
  • 数组是“包含这个类”还是“指向这个类的对象的指针”不是一个微不足道的、无关紧要的细节。对于这个问题,这是一个非常重要的考虑因素。因此,对于整个问题,不可能有单一的答案。
  • 如果您有A arr[10];,则根本不使用delete[] arr;。你只有deletenew。你只有delete[]new[]。而在现代 C++ 中,您应该考虑使用容器和智能指针。

标签: c++ arrays pointers destructor delete-operator


【解决方案1】:

只需 delete[] 数组就足够了。使用 delete[] 操作符删除数组时,保证数组的每个元素都被删除。

【讨论】:

  • 如果不了解 OPs 代码的详细信息,这不是一个足够的答案。 OP 声明我定义了一个包含此类(或指向此类对象的指针)的数组。因此,OP 必须注意一个区别:数组中的实例将被 delete[] 删除,但如果它是指向由 new 创建的对象的指针,则必须单独删除这些实例。
【解决方案2】:

如果我使用 delete[],会这样做

如果您使用new 分配一个动态数组,那么将指向该数组第一个元素的指针传递给delete[] 将调用每个元素的析构函数,并释放内存。如果您没有分配动态数组,那么使用delete[] 将导致未定义的行为。

我是否必须手动释放所有元素(删除 arr[i])

取决于数组包含的内容。如果数组元素拥有指向动态分配的非数组对象的裸指针,那么可以。如果数组不包含它,那么使用 delete 将导致未定义的行为或格式错误的程序。

附:不要使用newdelete[]。如果您需要动态数组,请改用std::vector

【讨论】:

  • 非常感谢您的回答,我不允许在我的代码中使用 STL,这就是我使用普通数组的原因,所以如果我使用 new 创建一个指针数组,我应该做一个循环并删除 arr[i] 并在循环后删除 [] arr 或仅删除 [] arr 就足够了?
  • @AdanSuleiman 取决于数组中的指针指向什么。
  • 它们指向一个包含两个指向 AVL 树的指针的类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多