动态分配内存以更改以未知大小C ++开头的数组大小

时间:2014-10-04 18:30:57

标签: c++ arrays dynamic allocation

如何动态分配大小将发生变化的数组,因为存储在数组中的内容将从文件中读取。关于使用向量有很多建议,但我想知道如何以数组方式进行。

我知道内存分配是

int count;
int *n = new int[count];

假设变量count将在循环中递增。我该如何改变数组的大小?

另外,如果我们使用malloc做了什么呢?

3 个答案:

答案 0 :(得分:3)

不要试图使阵列分配完全遵循您要存储的不断变化的大小要求。考虑使用传统的2 * N倍数。当数组已满时,通过增加2 * N(重新分配两倍大的新数组)重新分配,并复制项目。这会以对数方式摊销重新分配成本。

请记住,您打算使用低级数组实现的逻辑正是vector存在的原因。你不可能有效地实现自己的,或者没有bug。

但是如果你设置了它,那么继续计算2的倍数,从现实的东西开始(或者最接近的2的四舍五入)

答案 1 :(得分:2)

你可以保留两个指针p和q(占位符),当计数发生变化时,你需要为p做一个新的分配,然后才需要解除分配先前的分配,甚至在此之前应该转移先前p的内容也是新的。

int count, oldcount;
int *p = NULL;
int *q;
p = new int[count];
oldcount = count;

何时需要重新分配:

q = new int[count];
memcpy(q, p, oldcount * sizeof(int)); // OR for (int i = 0; i < oldcount; i++) q[i] = p[i];   
delete [] p;
p = q;
oldcount = count; // for use later

如果使用malloc,则需要使用calloc作为malloc传递的字节数。但C ++中的new和delete运算符不需要

答案 2 :(得分:1)

  

我如何更改数组的大小?

使用new:您无法做到。对象(此处为数组对象)的大小不能在运行时更改。

您必须创建一个具有适当大小的新数组,将旧的所有元素复制到新数组中并销毁旧数组。 为了避免许多重新分配,您应该总是分配超出您需要的数量。跟踪size(当前使用的元素数量)和capacity(已分配数组的实际大小)。一旦你想增加size,检查是否还有一些内存(size<capacity)并尽可能使用它;否则,应用上述方法。

完全 vector为你做的事情:但是使用RAII并尽可能方便。