调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
Resizing a vector an retrieving the value, Is this correct or can lead to segfault in any situation?
如果您在下面的示例中看到我已经将向量调整为大小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
.
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误