C++ 调整向量大小和检索值,这是正确的还是在任何情况下都可能导致SEGFULT?

C++ 调整向量大小和检索值,这是正确的还是在任何情况下都可能导致SEGFULT?,c++,vector,C++,Vector,如果您在下面的示例中看到,我已将向量大小调整为3,并将指针数据1存储在数据[5]处,您是否认为这是一个问题,除非我存储的记录不超过3条 这绝对是完美的,但这是正确的方法吗 #include<iostream> #include <vector> struct Data { int age; int id; }; int main() { std::cout<<"inside main"<<std::endl; std::vector

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

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

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

运算符[]的问题在于它不会对无效索引引发异常。如果您不确定索引是否有效,请考虑使用.AT成员函数检查IFVEC.Stase

一个STD::vector不是一个稀疏容器,从这个意义上讲,调用DATA ResiZ3允许您在选择的任何索引中向向量分配3个元素。事实并非如此

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



它似乎是在这个场合下工作的,因为C++运行库可能分配比3更多的元素空间,作为一个有用的优化来消除内存碎片。也许你可以通过观察向量的容量来判断。但千万不要依赖容量作为您可以访问的索引的上限。

data[5]=data1;这是一种未定义的行为。数据的有效索引为[0..2]。可能不需要指针向量。使用at将导致其他UB,因为不会捕获异常-@Jarod42-那不是UB。将调用std::terminate。这是很好的定义。如果你想存储在一个随机索引中,也许这就是你需要的。对于映射,数据[5]=data1;如果还没有,会创建一个条目。@VinayShukla这是UB最有趣的部分,有时它看起来很有效。有时它会大量崩溃。@VinayShukla:UB就是UB。那是因为你在这种情况下很幸运。具体来说,内存恰好不包含任何其他数据。如果真是这样,你就是在腐蚀它。此外,当数据重新分配时,您的数据[5]将不会被复制。在赋值之后,尝试将大小调整到一个较高的数字,并检查数据[5]的内容。@VinayShukla在这种特殊情况下,可能不会发生什么不好的事情,因为向量已经为5+个元素分配了存储。但绝对不能保证它能在这种或任何其他情况下继续工作。不要依赖于未定义的行为。@ravnsgaard这是因为在这种情况下你是不走运的。如果我不确定问题的答案,你认为stl映射是使用键和值对的好方法吗size@KostasRim是的,没错。但是你能解释一下为什么上面的代码会编译,即使是越界的吗?我不确定,如果这里是这样的话。@VinayShukla为什么要调整向量的大小?只需使用.push_back成员函数自动调整向量大小。@JeJo异常在运行时抛出。它会编译,会崩溃,但你会知道它为什么会发生,您将知道您有std::out of_range@KostasRim是的,这就是我想在这里回答的问题。我认为,由于C++运行库可能分配的空间多于3的元素,它似乎在这个场合工作是不正确的。如果将10个空格的容器调整为3,则[3-9]之间的元素将被销毁。@KostasRim:不一定,但您应该将它们视为已销毁。@KostasRim:标准在缩减案例中所说的只是将容器缩减为其第一个计数元素。例如,对于指针向量,没有明确提到已删除的指针被设置为nullptr。@KostasRim:请注意一件事:在缩减情况下,向量的容量是不允许更改的。原因是,在保留的元素上使用迭代器会释放所有的地狱。@Bathsheba特别是指针不会被删除,假设没有op~*数据会在它们上运行