C++ C+;中多个向量内的对象ID不一致+;

C++ C+;中多个向量内的对象ID不一致+;,c++,C++,我只是个初学者 我试图将一些对象存储在一个向量中,以便稍后可以循环它,但引用随后会发生变化,我不确定发生了什么 代码如下 #include <iostream> #include <vector> using namespace std; class Car; class Garage { public: vector<Car*> vCar; }; class Car { public: short i

我只是个初学者

我试图将一些对象存储在一个向量中,以便稍后可以循环它,但引用随后会发生变化,我不确定发生了什么

代码如下

#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;
}
#包括
#包括
使用名称空间std;
高级轿车;
班级车库{
公众:
矢量vCar;
};
班车{
公众:
短id;
};
int main()
{
车库;
短i;
对于(i=0;i<10;i++){
汽车;
car.id=i;
车库、vCar、后推(和汽车);
}
对于(i=0;i
如何解决这一问题取决于您-您可以将向量更改为存储
Car
对象,而不是指向
Car
对象的指针,您可以使用智能指针等

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

您可以直接存储对象,它存储原始对象的副本。您可以在此处找到一个。

更改

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

};


这将消除你正在经历的未定义的行为(你正在从栈中获取一个项目的地址)

谢谢你的回复!我仍然与指针混淆了,C++是如此的巨大!谢谢!我想我现在开始理解它了。?同样,这取决于您如何解决问题-如果您将对象直接推入向量,则为“是”(向量将在销毁时自动清除,因此您甚至不需要自己调用
clear()
,除非您愿意)。如果您使用智能指针,则它们也会自动清理。但是如果您使用
new
分配自己的对象并将这些指针推入向量,则需要迭代向量并
删除它们以释放内存。
class Garage {
    public:
        vector<Car*> vCar;

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

};
garage.vCar.push_back(&car);
garage.vCar.push_back(car);