抛出异常:读取访问冲突。访问数组中的指针时

时间:2017-12-12 20:23:06

标签: c++

我在尝试调用存储在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;
        }
    }
}

2 个答案:

答案 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)