为动态分配的阵列分配更多内存

时间:2015-03-12 16:44:07

标签: c++ arrays memory-management

我的C ++算法获取大小未知的数据(它逐个检测图像上的粒子,我不知道在此算法完成其工作之前将检测到多少粒子)。 所以,首先我要分配具有10000个元素的数组,并在处理过程中,如有必要,多次分配另外10000个元素。

这是我尝试的,它不起作用:

#include <iostream>
using namespace std;
int main(){
    int n = 3;
    int m = 3;
    float *a = new float[3];
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    float *b = a + 2;
    b = new float[3];
    b[0] = 4;
    b[1] = 5;
    cout << a[3] << endl;
} 

结果,我得到负无穷大。当然,我可以在不同的数组中处理这个,我可以分配一次大量的内存。我之后需要将完整的检测数据传递给函数,因此,我希望有一个大数组。

但是,有没有办法增加动态分配方式的大小?在玩具示例中我想要的是将数组a中的元素数量增加3,因此它将具有6个元素。

在Matlab中绝对有可能。那么C ++呢?

由于

3 个答案:

答案 0 :(得分:8)

您应该使用std::vector而不是原始数组。它被实施以有效地增长。您可以使用resize更改其大小,使用push_back附加到其中,或者使用insert插入范围(或其他各种内容)以使其增长。

在C ++中无法更改手动分配的数组的大小。一般来说,在原始数组上使用std::vector是一个好主意,即使大小没有改变。一些论点是自动化,防漏内存管理,额外的异常安全以及vector知道自己的大小。

答案 1 :(得分:5)

不,你不能增加数组的大小。如果要使用数组,则必须为整个新数组分配一个足够大的新块,并在删除旧数组之前复制现有元素。或者您可以使用更复杂的数据结构,而不会连续存储其元素。

幸运的是,标准库有容器可以自动处理;包括vector,一个可调整大小的数组。

std::vector<float> a(3);
a[0] = 0;
a[1] = 1;
a[2] = 2;

// you can resize it by specifying a new size
a.resize(4);
a[3] = 3;

// or by appending new elements
a.push_back(4);

答案 2 :(得分:0)

您应该在必要时使用vector然后使用resize或让它自行增长。

当你这样做时:

float *b = a + 2;
b = new float[3];

分配的内存不会连续分配给第一个分配,即使您之前将指针设置为指向末尾(无论如何都会被覆盖)。因此,当访问a[3]时,您就会越界。