调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?

Resizing a vector an retrieving the value, Is this correct or can lead to segfault in any situation?

本文关键字:段错误 错误 在任何情况下 检索 向量 是否 调整      更新时间:2023-10-16

如果您在下面的示例中看到我已经将向量调整为大小3并且我正在将指针data1存储在 data[5] 处,您是否认为这是一个问题,除非我存储的记录不超过 3 条。

这绝对完美无缺,但这是正确的方法吗?

#include<iostream>
#include <vector>
struct Data
{
int age;
int id;
};
int main()
{
std::cout<<"inside main"<<std::endl;
std::vector<Data*> data;
data.resize(3);
Data *data1 = new Data();
std::cout<<"after resize"<<std::endl;
data1-> age = 28;
data1-> id = 5592;
data[5] = data1;
std::cout<<"after populate = ";
std::cout<<data[5]->age<<std::endl;
return 0;

std::vector是一个稀疏容器,因为调用data.resize(3)允许您在您选择的任何索引处为向量分配 3 个元素。事实并非如此。

只能分配给索引 0、1 和 2。您尝试访问data[5]的行为尚未定义

由于您的C++运行时库可能会为超过 3 的元素分配空间,作为避免内存碎片的有用优化,它似乎在这种情况下工作。也许你可以通过查看矢量的容量来判断。但切勿依赖容量作为您可以访问的索引的上限。

这是未定义的行为。您正在写入尚未分配的内存。data不拥有过去的data[2].

读取数据[5]是未定义的行为,因为resize()函数将向量的大小更改为3。(有效索引 [0..2](。

operator[]的问题在于它不会对无效索引抛出exception。如果您不确定索引是否有效,请考虑使用.at()成员函数来检查if(vector.size() <= index) // throw(请记住,由于额外的检查和抛出,函数性能会慢一些(。另外,如果你想玩,请考虑safe version of stl.