我在尝试从函数的实例列表中返回实例时遇到一些麻烦。
我有一个集合,用于存储 Student 类的实例。我试图从“查找”函数返回一个实例,以便能够根据学生姓名找到该实例,我在另一个类/文件中调用该函数。我希望能够在另一个文件中获取此对象实例,编辑某些属性并在该实例列表中更新它。
我在Student.cpp中的查找功能:
static set<Student, StudentCmp> studentInstances;
Student* Student::find(int studentId) {
Student *foundStudent = new Student();
for (Student s: studentInstances) {
if(s.getStudentID() == studentId) {
foundStudent = &s;
}
}
return foundStudent;
}
另一堂课:
*Student::find(1).setStudentName("John");
是的,该学生 ID 确实存在于列表中,并且在查找功能内一切正常。它找到 ID 和相关地址,但是当我尝试使用查找函数给我的地址指向该变量时,出现此错误:
Unhandled exception at 0x7622DFD8 in Driver.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x006EF044
我假设该地址超出范围?我不知道为什么,但看起来地址在退出函数时不再指向我的对象,我查找了这个以找到答案,人们说使用“new”关键字将对象保留在堆上但这似乎对我不起作用。
有什么建议可以实现我想做的事吗?
这里的问题是,您返回的指针不是指向集合中的对象或您分配的指针,而是返回指向函数本地对象的指针,该对象在退出函数时被销毁。
for (Student s: studentInstances)
复制
Student
中的每个 studentInstances
。 您需要的是类似的参考
for (Student& s: studentInstances)
这样,当您返回一个指针时,您将返回一个指向位于
studentInstances
中的对象的指针