0

只是这里的初学者。

我正在尝试将一些对象存储在向量中,以便稍后循环它,但是之后引用发生了变化,我不确定发生了什么

代码如下;

#include <iostream>
#include <vector>

using namespace std;

class Car;

class Garage {
    public:
        vector<Car*> vCar;

};

class Car {
    public:
        short id;
};

int main()
{
   Garage garage;
   short i;

   for(i = 0; i < 10; i++) {
       Car car;
       car.id = i;

       garage.vCar.push_back(&car);
   }

   for(i = 0; i < garage.vCar.size(); i++) {
       cout <<  i << " " << garage.vCar[i]->id << endl;
       // output 9,9,9,..9 instead of 1,2,3,4...10, why is that?
   }


   return 0;
}
4

3 回答 3

4
  vector<Car*> vCar;

是一个存储指向Car对象的指针的向量。

 for(i = 0; i < 10; i++) {
   Car car;
   car.id = i;

   garage.vCar.push_back(&car);
}

在上面的for循环中,您Car在堆栈上创建对象。在 for 循环结束时,这些对象超出范围并将被销毁。因此,向量内的指针指向一些不存在的对象。您的代码中有未定义的行为

您可以直接存储对象,它存储原始对象的副本。你可以在这里找到一个现场演示

于 2013-06-28T03:42:52.313 回答
3

您正在将基于堆栈的对象的地址推送到向量中,但是该基于堆栈的对象将在超出范围后立即被销毁(因此,一旦 for 循环的迭代完成)。当您稍后取消引用该指针时,您实际上是从堆栈上创建最后一个对象的地址中读取的,这就是为什么您每次都获得相同值的原因。

如何解决这个问题取决于您 - 您可以更改向量以存储Car对象而不是指向Car对象的指针,您可以使用智能指针等。

于 2013-06-28T03:42:01.077 回答
0

改变

class Garage {
    public:
        vector<Car*> vCar;

};

class Garage {
    public:
        vector<Car> vCar;

};

garage.vCar.push_back(&car);

garage.vCar.push_back(car);

这将消除您遇到的未定义行为(您正在从堆栈中取出项目的地址!)

于 2013-06-28T03:47:40.640 回答