【问题标题】:Incorrect values with auto iterator on std::liststd::list 上的自动迭代器值不正确
【发布时间】:2017-05-09 15:54:28
【问题描述】:

我首先初始化一个酒店对象,然后初始化一些房间对象并分别打印它们的 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;

此外,这里是 Hotel 类中这些方法的实现:

//header
list<Room*> rooms;

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

看看输出!

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

【问题讨论】:

  • 我会假设 addRoom 按预期工作。在这种情况下,您有 std::list of dangling pointers。
  • 我猜问题出在你的 Room 类的某个地方。请也提供该代码。

标签: c++ list pointers iterator auto


【解决方案1】:

由于您尚未发布 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&lt;Room*&gt; 充满了悬空指针——指向不再属于你的内存的指针。这会导致未定义的行为。

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

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;
    }
};

【讨论】:

  • 我明白你在说什么,因为有很多代码已经在使用这样的指针,我将切换必要的部分以使用 new 。
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多