在下面的代码中,Struct2中的Struct1指针应该一致地指向Struct1的某个对象。这些结构中的每一个都包含在一个 vector 中。
但是,当我输出Struct2对象中指向的Struct1对象的索引变量时,在某些情况下会返回错误的索引变量。
为什么指向 vector 中包含的对象的指针有时会指向 vector 中的不同对象?
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;
}
}
最佳答案
问题是你获取了一个指向 vector 中的项目的指针:
s2s.at(propIndex).s1 = &s1s.at(index);
vector是一个动态结构,当它增长时,它的数据可能会被重新分配。因此任何 push_back()
都可能使所有指针无效:
s1s.push_back({ .index = i, .data= {} });
请注意, vector 分配算法旨在为需要增长的多个元素保留空间。这说明该问题只是偶尔出现。
一种解决方案可能是不保留指针,而是保留元素的索引以及指向 vector 的指针。
关于c++ - 指向 vector 中对象的指针有时指向 vector 中的不同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60591649/