c++ - 调整向量大小以检索值,这是正确的还是在任何情况下都可能导致段错误?
问题描述
如果您在下面的示例中看到我已将向量的大小调整为大小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;
解决方案
Astd::vector
不是稀疏容器,因为调用 data.resize(3)
允许您在您选择的任何索引处将 3 个元素分配给向量。事实并非如此。
您只能分配给索引 0、1 和 2。您尝试访问的行为data[5]
是undefined。
它似乎在这种情况下工作,因为您的 C++ 运行时库可能为超过 3 个元素分配空间,作为避免内存碎片的有用优化。可能您可以通过查看向量的容量来判断。但永远不要依赖容量作为您可以访问的索引的上限。
推荐阅读
- visual-studio - 项目与包的 C# VisualStudio 依赖项
- python - 由于新的硬盘驱动器,运行以前正常的代码时出错
- react-native - Firebase 动态链接无法打开 App Store
- python - Scapy,Pycharm 问题需要解决 [Cannot find reference 'ARP' in 'all.py']
- android - kotlin根据查询结果修改dao查询
- javascript - 以箭头函数格式返回并传递回调
- java - 使用 recyclerview 和 volley 错误解析 JSON 数据
- javascript - 当明确设置为缓存的站点内容应小于 2Mb 时,482Mb 被存储在缓存中
- swift - 无法将元组传递到列表视图
- pine-script - 如何检测过去'n'支蜡烛是否满足特定要求?