首页 > 解决方案 > 调整向量大小以检索值,这是正确的还是在任何情况下都可能导致段错误?

问题描述

如果您在下面的示例中看到我已将向量的大小调整为大小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;

标签: c++vector

解决方案


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

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

它似乎在这种情况下工作,因为您的 C++ 运行时库可能为超过 3 个元素分配空间,作为避免内存碎片的有用优化。可能您可以通过查看向量的容量来判断。永远不要依赖容量作为您可以访问的索引的上限。


推荐阅读