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