c++ - 动态向量数组中的 C++ 访问冲突读取位置 0xFFFFFFFFFFFFFFFF
问题描述
这段代码是这样说的:(代码试图填充外观数组直到 100)我修复了 arrayOne[0].numberOfThings 中向量数组的大小,因为我知道它是它可以包含的最大项目数将其视为已知整数。
int max = 100;
int maxNThings = arrayOne[0].numberOfThings; //Integer that I know and I pickit as the max for dynamic array
vector<Thing>* appearanceArrayOfNumThings;
appearanceArrayOfNumThings= new vector<Thing>[maxNThings];
for (int i = 0; i<max;i++){
int currentNumberOfThings = arrayOne[i].numberOfThings;
appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
}
我有
访问冲突读取位置 0xFFFFFFFFFFFFFFFF
在 for 语句中,行appearanceArrayOfNumThings[currentNumberOfThings ].push_back(arrayOne[i]);
我在想是否是因为我不知道的矢量行为。
你能给我任何线索或者你看到我做错了什么吗?
解决方案
首先,您应该使用调试器,您会立即发现错误。
其次,new vector<Thing>[maxNThings]
是个坏主意。不要那样做。std::vector<std::vector<Thing>>
至少使用。在我看来,包含向量的结构向量更清晰。
使用向量的向量,您可以使用.at()
which 会告诉您的错误。
此代码将始终调用未定义的行为。
int maxNThings = arrayOne[0].numberOfThings;
让我们假设这个数字是12
。
appearanceArrayOfNumThings = new vector<Thing>[maxNThings]; // 12
这将创建一个包含 12 个向量的数组。可索引从0
到11
。
for (int i = 0; i < max ;i++){
// ...
}
对于第一次迭代,i
等于0
。让我们继续。
// i == 0
int currentNumberOfThings = arrayOne[i].numberOfThings;
此时,arrayOne[i]
与 的值相同arrayOne[0]
,因为i
等于0
。所以currentNumberOfThings
等于12
, 等于maxNThings
。
appearanceArrayOfNumThings[currentNumberOfThings ]
这种访问是越界的,appearanceArrayOfNumThings[12]
因为它可以从toappearanceArrayOfNumThings
索引。你进入UB土地。这是你的错误。0
11
对于任何值,它总是会失败maxNThings
。
推荐阅读
- javascript - 为什么我需要覆盖prototype.constructor 值?
- php - SQLSTATE [42S02]:未找到基表或视图:1146 表“fresh_start.event”不存在(SQL:从“事件”中选择计数(*)作为聚合)
- javascript - React/Redux,从模型调用方法抛出 TypeError
- ios - 如何在我的 UIPageViewController.swift 中添加另一个页面?
- google-cloud-platform - Swagger 文档位置不存在
- python - 如何在熊猫系列中为 NaN 赋值?
- visual-studio - 从 Visual Studio 部署到 Azure Analysis Services 会重置数据源“路径”属性
- ansible - ansible的authorized_keys问题
- multithreading - 如何在 freeRTOS 中使用互斥锁同步线程?
- z3 - 如何在 circleci 中安装最新的 z3 版本?