为动态分配的数组分配更多内存

Allocate more memory for dynamically allocated array

我的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++呢?

谢谢

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

当你这样做时:

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

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

你应该只使用 std::vector instead of raw arrays. It is implemented to grow efficiently. You can change its size with resize, append to it with push_back or insert a range (or various other things) with insert 来种植它。

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

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

幸运的是,标准库有容器来自动处理这个问题;包括 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);