从未知大小的C++开始,动态分配内存以更改数组大小
Dynamically allocating memory for changing array size starting with unknown size C++
如何动态分配一个数组,因为存储在数组中的内容将从文件中读取,所以数组的大小将发生变化。关于使用向量有很多建议,但我想知道如何使用数组的方式。
我知道内存分配是
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和所有可能的便利。
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它