如何释放数组中的单个元素?

时间:2018-04-27 12:36:20

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

我像这样分配内存:

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

然后为其赋值。但是,我想在此期间释放它分配的一些空间。我知道

delete[]

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

  1. 您可以使用环形缓冲区实现FIFO:只需引入两个变量:firstlast,将新元素写入array[last % RingBufferSize],然后增加last并读取来自array[first % RingBufferSize]的元素后跟第一个增量;当first == last表示您的FIFO为空时,(first + 1) % RingBufferSize == last % RingBufferSize表示您的FIFO已满,而您无法在不拒绝最旧项目的情况下添加。使用这种方法,您可以使用静态数组并完全避免使用堆流量。
  2. 使用binary heap从添加顺序(最早的第一个)获取的键。使用这种方法,只有当数据溢出时,您才必须为数组增加分配的内存(如果您的数据源和数据接收器以相同的速度运行并且您需要排队以阻止数据流,则表示“从不”)。二进制堆本身对于添加和删除具有log(N)的复杂性,这比通过在没有删除元素的新数组中复制它来修补数组中的孔要好得多。{/ li>