有人请看下面的代码片段(全部来自一个文件),并建议我最后描述的问题吗?
成员:
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))但我是新手使用向量并且不确定我正在目睹什么样的间接。
我有allAtLoc
和newContainer
超出范围,虽然它们只是对象的指针,但它们有副作用。顺便说一句,我的collected
向量不包含错误。
在我搬到std::vector
之前,这一切都运转正常,我不明白我的间接是怎么回事,请有人建议吗?
答案 0 :(得分:1)
您的代码很难阅读,但看起来您正在指向vector
内的元素。当容量发生变化时,指针,迭代器和对vector
的引用都将失效。这可能是插入vector
的任何函数的副作用,因为创建了一个新的更大的内部数组,当前内容被复制到其中。
如果要使用指向vector
中元素的指针,则必须确保它们不会失效。如果您知道元素的数量,则可以在插入任何元素之前调用reserve
。