为动态分配的阵列分配更多内存
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++呢?
谢谢
只使用std::vector
而不是原始数组。实施它是为了有效地增长。您可以使用 resize
更改其大小,并附加push_back
或插入带有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);
你应该使用vector
,然后在必要时resize
,或者让它自己增长。
当您执行以下操作时:
float *b = a + 2;
b = new float[3];
即使您之前将指针设置为指向末尾,分配的内存也不会连续分配给第一个分配(无论如何都会被覆盖)。因此,当访问a[3]
时,你会越界。
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配