代码之家  ›  专栏  ›  技术社区  ›  bur

指向矢量中对象的指针有时指向矢量中不同的对象

  •  0
  • bur  · 技术社区  · 4 年前

    但是,当我输出指向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;
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Christophe    4 年前

    问题是,您将指针指向向量中的项:

    s2s.at(propIndex).s1 = &s1s.at(index);
    

    这个 vector push_back() 可能使所有指针失效:

    s1s.push_back({ .index = i, .data= {} });
    

    请注意,向量分配算法设计用于在需要增长时为多个元素保留空间。这就解释了这个问题只是偶尔出现。

    一种解决方案可以是不保留指针,而是保留元素的索引以及指向向量的指针。