为动态分配的数组分配更多内存
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);
我的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);