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

Dynamically allocating memory for changing array size starting with unknown size C++

本文关键字:内存 动态分配 数组 开始 未知 C++      更新时间:2023-10-16

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

我知道内存分配是

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

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

另外,如果我们使用malloc呢?

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

请记住,您打算用低级别数组实现的逻辑正是vector存在的原因。您不太可能高效或无错误地实现自己的功能。

但如果你已经设置好了,请继续计算2的倍数,从现实的(或最接近的2的整数倍)开始

您可以保留两个指针,p和q(占位符),当计数发生变化时,您需要对p进行新的分配,在此之前,需要解除分配早期的分配,甚至在此之前,早期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,那么您需要使用作为传递malloc的字节数。但C++中的新运算符和删除运算符不需要

如何更改数组的大小?

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

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

这正是vector为您所做的:但有了RAII和所有可能的便利。