指向(全局/持久)对象的指针超出范围后,对象(非指针)的成员向量将“取消设置”

时间:2011-10-26 20:58:36

标签: c++ pointers vector parameter-passing visibility

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

成员:

    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类型的成员无效或为空。我以为我已经将它设置为指向持久化对象的指针(在另一个数据结构中管理,一个简单的数组(/ ptr - 它是new / malloc'd))但我是新手使用向量并且不确定我正在目睹什么样的间接。

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

在我搬到std::vector之前,这一切都运转正常,我不明白我的间接是怎么回事,请有人建议吗?

1 个答案:

答案 0 :(得分:1)

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

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