在std :: list上使用auto迭代器的值不正确

时间:2017-05-09 15:54:28

标签: c++ list pointers iterator auto

我首先初始化一个酒店对象然后初始化一些房间对象并分别打印他们的id(正确打印出来)。

for(int j=0;j<5;j++){
    Room r(1, 30);
    hotel.addRoom(r);
    cout << "Id: " << r.getId() << endl;
}

然后,我在列表上进行迭代:

cout << "Initialized rooms with Ids: ";
for(auto iterator : hotel.getRooms()){
    cout << iterator->getId() << " ";
}
cout << endl;

此外,这里是酒店类的实施:

//header
list<Room*> rooms;

//source
list<Room*> & Hotel::getRooms(){
    return rooms;
}

看看输出! Output

每个其他部分(如id生成和对象构造)都经过测试并且工作正常。

1 个答案:

答案 0 :(得分:0)

由于您尚未发布addRoom函数的定义,因此通过演绎的力量,我得出的结论类似于:

void Hotel::addRoom(const Room& room) {
    rooms.push_back(&room);
}

然后给出以下循环:

for(int j=0;j<5;j++)
{
    // This creates a Room object local to each iterator of the loop
    Room r(1, 30);
    // This adds the address of this local variable in the list
    hotel.addRoom(r);
    cout << "Id: " << r.getId() << endl;
    // The variable r is destroyed here
}

所以最后你的std::list<Room*>充满了悬空指针 - 指向不再属于你的记忆的指针。这会导致未定义的行为。

我建议你完全放弃指针并改为:

class Hotel 
{
    std::list<Room> rooms;

public:
    void addRoom(const Room& room) {
        rooms.push_back(room);
    }
    std::list<Room>& Hotel::getRooms() {
        return rooms;
    }
    const std::list<Room>& Hotel::getRooms() const {
        return rooms;
    }
};