【问题标题】:How do I deallocate a single element of an array?如何释放数组的单个元素?
【发布时间】:2018-04-27 12:36:19
【问题描述】:

我是这样分配内存的:

int *array = new int[n];
array[5] = 3;

然后给它赋值。但是,我想同时释放它分配的一些空间。我知道

delete[]

将释放它使用的内存,但我不希望删除整个数组,而只删除某些元素,例如第一个元素,以实现 FIFO 列表。如何释放第一个元素,然后在数组末尾为新元素分配空间而不删除整个元素?可以用vector代替int吗?

【问题讨论】:

  • 在 C++ 中,如果您曾经想过“动态数组”,那么接下来您应该总是std::vector。如果你想要一个“FIFO”结构,那么std::queue.
  • 我不想删除整个数组,只删除某些元素你不能这样做。要么全部,要么没有。
  • 我是这么想的,那我就坚持使用向量吧。谢谢!
  • 我认为你应该继续前进!有很多关于它们的样本,它们是为您要求的目的而制作的。

标签: c++ memory-management dynamic dynamic-memory-allocation


【解决方案1】:

一旦分配,您可以完全释放内存。部分脱涂层是不可能的。但是,您可以使用所需数量的元素重新分配另一个空间,然后将较早的内容复制到新分配的内容并取消分配较早的内容。例如,

int *array = new int[n];
array[5] = 3;
std::vector<int> myvec(n1); // n1 is the new size
std::copy (array, array+std::min(n1,n), myvec.begin() );
delete [] array;

【讨论】:

  • 或者只使用std::vector - 更容易。
  • 不可以先放一个指向元素的指针,然后调用“删除指针”吗?
【解决方案2】:
  1. 您可以使用环形缓冲区来实现 FIFO:只需引入两个变量:firstlast,将新元素写入 array[last % RingBufferSize],然后递增 last,然后从 array[first % RingBufferSize] 读取元素,然后递增第一; first == last 表示您的 FIFO 为空,(first + 1) % RingBufferSize == last % RingBufferSize 表示您的 FIFO 已满,如果不拒绝最旧的项目,则无法添加。通过这种方法,您可以使用静态数组并完全避免使用堆流量。
  2. binary heap 与取自加法顺序的键一起使用(最早的在前)。使用这种方法,您必须仅在数组溢出时才增加分配的内存(如果您的数据源和数据接收器以相同的速度工作并且您需要队列来抑制数据流,这意味着“永远不会”)。二进制堆本身的添加和删除复杂度约为 log(N),这比 O(N) 通过将其复制到新数组中而不删除元素来修补数组中的漏洞要好得多。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多