调整矢量大小并检索值,这是正确的还是可以在任何情况下导致段错误?

Vin*_*kla 0 c++ vector

如果您在下面的示例中看到我已将向量调整为大小,3并且我将指针存储data1在数据[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;
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 9

一个std::vector不是在这个意义上话的稀疏容器 data.resize(3)允许你在你所选择的任何索引分配3个元素的矢量.事实并非如此.

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

由于您的C++运行时库可能为3个以上的元素分配空间,因此它似乎正在这个场合工作,作为消除内存碎片的有用优化.可能你可以通过查看向量的容量来判断.但永远不要依赖容量作为您可以访问的索引的上限.

  • @KostasRim:在减少的情况下,所有标准都说"容器被减少到它的第一个计数元素".例如,对于指针向量,没有明确提到被删除的指针被设置为`nullptr`. (2认同)
  • @KostasRim:请注意一件事:在减少的情况下,向量的*容量*不允许**改变.原因是所有地狱都会被保留元素上的迭代器释放. (2认同)