c++ - 指向 vector 中对象的指针有时指向 vector 中的不同对象

标签 c++ pointers vector

在下面的代码中,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/

相关文章:

c++ - 使用容器自己的迭代器分配容器是否安全?

c++ - 为什么我可以改变 const 对象中的成员变量,这是返回 const 对象函数的结果?

c++ - 包裹在共享指针中时的 vector 构造

c - 是否有理由不键入强制转换指针 (C)?

r - 获取向量中缺失值的运行长度

c++ - 对多个字段的元素进行排序

c++ - 如何避免 Helgrind 的误报?

c++ - 使用给定的第一个和最后一个迭代器迭代范围

c - 在c中使用指针覆盖内存的可能性?

c++ - C++ 中 const 自动指针的行为