【问题标题】:C++ Deleting part of dynamic arrayC ++删除动态数组的一部分
【发布时间】:2011-12-06 13:33:27
【问题描述】:

假设我有一个动态数组,例如:

int* integers = new int[100];

有没有办法只删除部分数组如:

int* integers2 = integers + 50;
delete[] integers2;

我不仅要删除 50 及以后的所有内容,而且如果我在原始整数数组上调用另一个 delete[],那么它只会删除正确数量的内存,而不是尝试删除最初分配的数量和段错误.

我为什么要这样做:我有一个按数组级别构建的数据结构,我希望能够从一个完整的数组创建这个数据结构。所以我想能够说

int* level1 = integers;
int* level2 = integers + 50;
int* level3 = integers + 100;

但是当不再需要le​​vel 3时,数据结构会自动删除[] level3。我需要知道这将正常运行,而不仅仅是破坏数组中的所有内容。如果可以,那么我只需要创建新数组并将内容复制过来,但出于性能原因,最好避免这样做。

编辑:每个人似乎都在得出结论,我应该首先为我的数据结构使用动态调整大小的容器(即向量、双端队列)。我使用数组级别是有充分理由的(而且它们的大小不像我在示例中那样)。我只是在寻找一种好方法来为我的数据结构创建一个构造函数,该构造函数接受一个数组或向量,而不需要将原始内容复制到新的数据结构中。

【问题讨论】:

  • std::deque 是你要找的。​​span>
  • 不,不是。事实上,我正在寻找的基本上是一种从数组创建双端队列而不从原始数组复制值的方法。
  • std::deque 很像一个自动调整大小的数组。直线向上的数组不能调整大小(除非它是用malloc 分配的,然后只调整大小)
  • 只是好奇,您使用 c 样式数组的原因是什么?

标签: c++ arrays dynamic


【解决方案1】:

不,这将无法正常运行。您只能从new[] 获得的delete[] 指针,否则结果未定义,可能会发生不好的事情。

如果你真的需要数组变小,你必须分配一个新数组并手动复制内容。

【讨论】:

    【解决方案2】:

    通常在分配内存时,指针之前会有一些内务处理。

    即家务(指针)数据

    你会搞砸的。

    【讨论】:

      【解决方案3】:
      int* integers2 = integers + 50;
      delete[] integers2;
      

      不会工作,因为 new 是在 int* 上创建的,所以 100 个 int 的空间已分配给整数,现在 integers2 只是指向第 50 个整数位置的指针,它没有分配给它自己的空间,所以使用delete 不会删除其余的整数2,它只会给出不稳定的结果。

      你可以做的是将前50个复制到另一个数组中,并完全删除前一个数组。

      delete 只会删除分配了空间的指针,使用 delete 指向另一个指向分配给第一个指针的空间的指针不会删除分配给第一个指针的任何空间。

      delete[] integers2 不会删除分配给 integers1 或任何其他指针的任何空间。

      【讨论】:

        【解决方案4】:

        动态分配器(如new)通常不喜欢你释放他们给你的部分内存。如果你使用<malloc.h>定义的库函数malloc()free()而不是newdelete,那么你可以使用realloc(),尽管在大多数情况下你会关心它的大小差异无论如何都要为你复制。

        动态调整容器大小通常使用指数规则来调整大小:如果空间不足,它们(例如)会加倍分配(并复制旧数据),如果在使用之前删除数据(例如)他们复制到较小分配中的分配不到一半。这意味着您永远不会浪费超过一半的内存,并且复制每个添加或删除的元素的成本实际上是恒定的。但是,实现所有这些是一件很痛苦的事情,所以只需使用 std::vector 并让它为您完成它:)。

        【讨论】:

        • 使用 std::vector 并不能解决我原来的问题。出于某种原因,我使用了一组分层数组而不是单个动态调整大小数组(即向量)。问题不在于它是如何存储的,而是我试图用一种简单的方法让向量或动态数组成为我的数据结构的输入,而无需从原始数据结构中复制所有内容
        • @Floss:什么是“分层数组”?数组数组? vector::data() 有什么问题?
        【解决方案5】:

        不,您不能对使用new[] 分配的固定大小的数组执行此操作。如果您想拥有一个动态数组,请使用其中一个 STL 容器,例如 std::vector

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-10
          • 2014-09-02
          • 1970-01-01
          • 1970-01-01
          • 2018-05-01
          • 1970-01-01
          • 2016-04-12
          相关资源
          最近更新 更多