C++ 离开函数后丢失一些数据
我有一个包含以下向量的类:C++ 离开函数后丢失一些数据,c++,C++,我有一个包含以下向量的类: class MainMenu { private: std::vector <Car> vehicles; std::vector <Instructor> instructors; std::vector <Trainee> trainees; std::vector <Lesson> lessons; public: std::vector<Car>&a
class MainMenu {
private:
std::vector <Car> vehicles;
std::vector <Instructor> instructors;
std::vector <Trainee> trainees;
std::vector <Lesson> lessons;
public:
std::vector<Car>& getVehicles();
std::vector<Instructor>& getInstructors();
std::vector<Trainee>& getTrainees();
std::vector<Lesson>& getLesson();
}
在代码的某个地方,我执行这样的功能:
Car *car = mainMenu.searchForCarById(idOfVehicle);
Car* MainMenu::searchForCarById(int id) {
for (Car elem : vehicles) {
if (elem.getIdInSystem() == id) {
return &elem;
}
}
}
在调试的过程中,我一步一步地执行这个代码,这个简单的函数正确地搜索car,但每当我从函数返回时,每个变量都是字符串不相似的。例如,在name
变量中,我收到“
”。我认为重要的是要提到,只有字符串消失!int保持原样。我做错了什么?更改这行
for (Car elem : vehicles)
到
否则,您将保存一个指向超出范围的局部变量的指针,从而针对
elem
是车辆中包含的实际对象的副本。然后返回一个指向这个被破坏的本地对象的指针,使其悬空。解决方法是使用汽车&
代替。当您在车辆中循环时,以下行:
for (Car elem : vehicles)
制作每个元素的副本并将其存储在elem中
相反,请尝试通过引用获取元素:
for (Car& elem : vehicles)
然后,你可以得到一个指针。但是,一旦修改数组,此指针可能会变为无效。因此它仍然不是最优的。您返回的是一个局部变量的地址,该地址在使用函数后会被删除。这是未定义的行为。在您的情况下,您应该将您的elem
作为参考-这将很好地工作,并具有删除不必要副本的附加好处。searchForCarById()
中还存在“并非所有代码路径都返回值”错误。下次请提供一个适当的.Unrelated,但为什么要有私有类成员,然后提供返回可变引用的公共访问器呢?不妨先公开这些班级成员。
for (Car elem : vehicles)
for (Car elem : vehicles)
for (Car& elem : vehicles)