在下面的代码中,Struct2中的Struct1指针应始终指向Struct1的某个对象。这些结构的每一个都包含在一个向量中。
但是,当我输出Struct2对象中指向的Struct1对象的索引变量时,在某些情况下会返回错误的对象。
为什么指向向量中包含的对象的指针有时指向向量中的另一个对象?
struct Struct1
{
size_t index;
std::vector<size_t> data;
}
struct Struct2
{
Struct1 *s1;
}
class MyClass
{
std::vector<Struct1> s1s;
std::vector<Struct2> s2s;
size_t propIndex = 0;
void input(QByteArray &line)
{
if (line == "1") {
for (size_t i = s1s.size(); i <= propIndex; i++) {
s1s.push_back({ .index = i, .data= {} });
}
QByteArrayList list = getList();
for (auto id : list) s1s.at(propIndex).data.push_back(id.toULongLong());
}
else {
if (propIndex == s2s.size()) {
s2s.push_back({ .s1 = nullptr });
}
if (line == "2") {
size_t index = getIndex();
for (size_t i = s1s.size(); i <= index; i++) {
s1s.push_back({ .index = i, .data= {} });
}
s2s.at(propIndex).s1 = &s1s.at(index);
}
}
propIndex++;
}
QByteArrayList output()
{
QByteArrayList output;
for (auto s2 : s2s) {
output += QByteArray::number(s2.s1->index) + "\n";
}
return output;
}
}
问题是您将指针指向向量中的项目:
s2s.at(propIndex).s1 = &s1s.at(index);
的向量是一个动态结构,并且当它生长其数据可以被重新分配。因此,任何push_back()
可能会使所有指针失效:
s1s.push_back({ .index = i, .data= {} });
请注意,向量分配算法旨在在需要增长时为几个元素保留空间。这说明该问题仅偶尔出现。
一种解决方案是不保留指针,而保留元素的索引以及指向向量的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句