对象(不是指针)的成员向量在指向(全局/持久)对象的指针超出范围后"取消设置"

Member vector of objects (not pointers) gets 'unset' after the pointer to (global/persisting) object goes out of scope

本文关键字:对象 指针 范围 持久 设置 取消 成员 向量 全局      更新时间:2023-10-16

请有人看看下面的代码片段(全部来自一个文件(,并就我将在最后描述的问题提出建议?

成员:

    std::vector<cHasAMyClass>   collected;
    std::vector<cHasACHasAMyClass>  memberVector;//Actually an array of vectors, but simpler not to be.

内部/本地类的构造函数:

    cHasACHasAMyClass(cHasAMyClass *ptrToCHasAMyC, int stuff) :
                masterRef(ptrToCHasAMyC),
                other_stuff(stuff) {}

我使用的方法:

cHasAMyClass *firstUniqueOccurrence(std::vector<cHasAMyClass> *masterList, myClass *qSq) {
    for (int i = 0; i < (int)masterList->size(); ++i)
        if ((*masterList)[i].myClassPtr == qSq) return &((*masterList)[i]);
    masterList->push_back(cHasAMyClass(qSq));
    return &(masterList->back());
}

调用上述方法的块:

{
    std::vector<myClass *> allAtLoc;
    if (map->getAllHere(curLoc, &allAtLoc)) {
        for (int i = 0; i < (int)allAtLoc.size(); ++i) {
            int stuff = 42; //Or otherwise
            cHasAMyClass *newContainer = firstUniqueOccurrence(&(collected), allAtLoc[i]);
            memberVector.push_back(cHasACHasAMyClass(newContainer, stuff));
        }
    }
    allAtLoc.clear();
}

问题是稍后(在离开上面的块时立即正常(memberVector[0].masterRef出现混乱,我检测到(除了崩溃(,因为它的类型myClass的成员无效或为null。我以为我已经把它设置为一个指向持久化对象的指针(在另一个数据结构中管理,一个简单的数组(/ptr-它是new/malloc'd((,但我对使用向量很陌生,不确定我看到的是什么样的间接。

我让allAtLocnewContainer超出范围,尽管它们只是指向对象的指针,但它们也有副作用。顺便说一句,我的collected矢量不包含错误。

在我搬到std::vector之前,一切都很好,我不明白我的间接方式怎么错了,请有人给我建议吗?

很难阅读您的代码,但看起来您正在获取指向vector中元素的指针。当vector的容量发生变化时,指针、迭代器和对它的引用将失效。这可能是插入vector的任何函数的副作用,因为会创建一个新的更大的内部数组,将当前内容复制到该数组中。

如果要使用指向vector中元素的指针,则必须确保它们不会无效。如果您知道元素的数量,则可以在插入任何元素之前调用reserve