C ++地图矢量参考错误

时间:2016-11-25 18:12:35

标签: c++ data-structures

我从以下代码中收到程序崩溃:

// declaration in header:
std::vector<Animation> mAnimations; // animation objects
std::map<std::string, Animation*> mBoneAnimations; // map strings to animation objects from "mAnimations"

// source code in source file:
this->mAnimations.push_back(Animation());
this->mBoneAnimations[bone_name] = &this->mAnimations.back();
// ...
// at different points, we modify the LAST element in animation
this->mAnimations.back().addTranslation(Vector3(...));

// this is where the problem occurs later on in the program:
Animation test = *(this->mBoneAnimations.at("Body")); // CRASH

此代码在最后一行崩溃。我80%确定这个问题是由我设置这个数据结构的方式引起的。我的猜测是,可能使用&#34; back()&#34;来获取向量中最后一个对象的引用。可能是造成这种情况。我尝试将其更改为:

this->mBoneAnimations[bone_name] = &this->mAnimations[this->mAnimations.size() - 1];

但这也无济于事。问题是导致此崩溃的原因,更具体地说,我该如何解决?

编辑:我确信有一个&#34; Body&#34;对象在那里。此崩溃是内存错误。

1 个答案:

答案 0 :(得分:2)

当你附加到std :: vector时,它有时必须重新分配。当它这样做时,它将所有元素移动到一个新位置,以便将元素保持在连续的内存中。这会使所有指针,引用和迭代器无效,因此mBoneAnimations正在存储悬空指针。

只要你只是推/弹到后面/前面,快速解决方法就是使用std :: deque。当你push_back到一个双端队列并且空间不足时,它只是添加了一个新的元素块,而不是重新分配所有元素,只留下它们所在的位置。 (参见迭代器有效性部分)。推前和弹出相同。