为什么无法访问按 vector::reserve 分配的内存
Why can't you access memory allocated by vector::reserve
的问题,但为什么当你打电话时会这样
std::vector<int> vec;
vec.reserve(100);
vec[89] = 99; // vector subscript out of range.-
您不允许访问矢量的元素 0-99?考虑到保留增加的向量容量(分配了该大小的新数组)并且您应该能够访问这些元素,即使它们为空或为空启动,这没有多大意义。
我明白,如果您按以下方式进行操作:
std::vector<int> vec(99, 0);
vec[89] = 99;
您将被允许访问这些元素,因为它们将被初始化为 0,但是,除了最初通过构造函数之外,您不能多次使用这样的默认值调整矢量的大小。
使用数组,可以做到:
int[] arr = new int[100];
arr[89] = 99;
当然,您必须自己编写调整大小。
arr1 = new int[200]
memcpy (arr1, arr, 100);
arr = arr1;
arr[90] = 100;
有没有办法将std::vector
视为数组,一旦达到一定容量就会自行调整大小?
你不应该混淆resize
和reserve
-
reserve
分配空间(如果需要)但不初始化它,这样当您插入新元素时,仅调用构造而不进行重新定位(直到您使用所有保留空间) -
resize
分配空间(如果需要)并通过调用构造函数对其进行初始化。
因此,当您reserve
空间时,新值在通过执行push_back
或resize
等操作初始化/构造之前无法访问
向量就像数组,如果您使用 insert
和 push_back
以及其他此类函数,一旦达到一定容量,它们就会自行调整大小。
你抱怨vec.reserve(100);
因为它调用了所有的构造函数,然后暗示你希望它像int[] arr = new int[100];
一样工作,但你似乎忽略了new int
也调用所有析构函数的事实。 他们在这里做同样的事情。
除了最初通过构造函数之外,您不能多次调整具有此类默认值的矢量大小
有vector::resize
可以调整数组的大小并默认构造任何新数组。 如果要"重置"现有,只需使用 std::fill
.
vector::reserve
的目的是insert
,push_back
不进行不必要的重新分配。 这是一个原始数组无法轻易复制的巧妙技巧。 这是额外的功能,而不是缺少的功能。
>C++是一个抽象,在这种抽象中,这些元素不是"空"或"空":它们根本不存在。只有他们的空间存在。
现在,在许多实际实现int
的情况下,如果你看一下内存,那么你就无法真正分辨出区别。您可以访问该内存。但是你违反了 vector
的合同,一旦你在容器上执行变异操作,这将打击你:它会带走你的记忆,它不会携带你的"数据"。
拒绝正确构造实际元素不会获得任何好处。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 向量.reserve()和分配效率(C )
- 为什么无法访问按 vector::reserve 分配的内存
- 在 std::vector 中重新分配 std::vector,在 std::vector.reserve() 之后
- QByteArray与reserve()的内部重新分配行为