我在尝试调用存储在collidersByLayer中的类中的方法时出错,此映射用于包含由图层标识的指针向量。
static map<int, vector<Collider*>> collidersByLayer;
//Called twice by both a player and a box
void AddCollider(Collider collider, int layer) {
//outputs either 640 for the player or 840 for the box
cout << collider.GetPosition().x << endl;
//checks if a layer already exists, if not make a new entry in the map
if (collidersByLayer.find(layer) == collidersByLayer.end()) {
collidersByLayer[layer] = vector<Collider*>();
}
//add the reference to the collider
collidersByLayer[layer].push_back(&collider);
//loop through the collidersByLayer map
for (auto const& x : collidersByLayer) {
vector<Collider*> colliders = x.second;
for (size_t c = 0; c < colliders.size(); c++) {
//the first time this runs fine, and outputs the position of the player (640).
//when this function is called for the second time,
//it gives me this error while trying to print the players position:
//Exception thrown: read access violation.
//__imp_sf::Transformable::getPosition(...) returned 0x44520010.
cout << colliders[c]->GetPosition().x << endl;
}
}
}
答案 0 :(得分:3)
你的问题在这里:
collidersByLayer[layer].push_back(&collider);
您正在向集合添加指向局部变量的指针。 <{1}}返回时,该对象被销毁。
答案 1 :(得分:0)
问题出在第collidersByLayer[layer].push_back(&collider);
行。您正在将Collider collider
的地址(本地对象)推送到静态地图中。只要属于它们的范围结束,就会销毁本地对象。换句话说,只要函数返回,该指针就指向一个被破坏的对象。如果再次调用AddCollider
,则会尝试从悬空指针读取未定义的行为。
听起来Collider
对象已经存在,您只想将地址添加到地图中。在这种情况下,您可以简单地将函数的参数作为引用类型。通过这样做,您将获得引用对象的地址,而不是那些对象的本地副本的地址。请尝试以下方法:
void AddCollider(Collider & collider, int layer)